ImageVerifierCode 换一换
格式:DOCX , 页数:61 ,大小:46.97KB ,
资源ID:6102820      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/6102820.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(C++算法汇总.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

C++算法汇总.docx

1、C+算法汇总说明: 实验指导书相关习题与教材每章书后习题基本重复,以下内容均以教材例题及教材书后习题为背景汇总,仅列出教材上的样关算法及出处。 在模仿教材例题或按书后要求编写算法程序时,需考虑算法所基于的数据结构和实现的场合。 算法所基于的数据结构:普通变量、指针、引用、结构体、类 算法实现的场合:在main()函数中实现、自定义函数实现、在类中的成员函数实现、类的友元函数实现等。 以下所例算法在第8章指针部分均有对应实现要求1、比较大小(整型、实型、字符型、字符串): 两个数据比较大小 三个整型数据比较大小(P50) /* 从键盘上输入三个整数,输出三个数中的最大数。 分析:先读入三个数,求

2、出前两个数中的大数,再求出该大数与第三个数之间的最大数。void main(void) int a,b,c,max; coutabc; max=a; /A if(maxb) max=b; /B if(maxc) max=c; /c coutn最大数是maxb) max=a; else max=b; coutc) coutmaxn; else coutcendl; */ /*编写程序,输入一个三位正整数,输出各位数字组成的最大值。例如:输入“123”,输出“321”。 int main(void) int a,b,c,max,mid,min,x; coutx; a=int(x/100); b=i

3、nt(x-a*100)/10); c=int(x-a*100-b*10); /分别得出该三位数的每一位上的值,并分别赋给a,b,c max=a; if(ba) max=b; if(maxc) max=c; /求出三个数的最大值 mid=b; if(ab & ca) mid=a; if(ac & cb) min=b; if(cmin) min=c; /求出三个数的最小值 coutx转换后的形式为:maxmidminendl; return 0; 2、分段函数的计算(P77第3、4题)/*编写程序,根据输入的x的值,按下列公式计算并输出y的值当-5=x=5且x!=0时y=x-1当x=0时y=x+1

4、当5x=100时y=x+5当x为其他值时y=100*/int main(void) int x,y; coutx; if(-5=x & x=5 & x!=0) couty=x-1即y等于:x-1; else if(x=0) couty=x+1即y等于:x+1; else if(5x & x=10) couty=x+5即y等于:x+5; else couty=100; coutendl; return 0;/*编写程序,输入一个三位正整数,输出各位数字组成的最大值。例如:输入“123”,输出“321”。*/ int main(void) int a,b,c,max,mid,min,x; cout

5、x; a=int(x/100); b=int(x-a*100)/10); c=int(x-a*100-b*10); /分别得出该三位数的每一位上的值,并分别赋给a,b,c max=a; if(ba) max=b; if(maxc) max=c; /求出三个数的最大值 mid=b; if(ab & ca) mid=a; if(ac & cb) min=b; if(cmin) min=c; /求出三个数的最小值 coutx转换后的形式为:maxmidminendl; return 0;3、求方程的根求一元二次方程的根(P51例,P116第15题)/* 求ax2+bx+c=0的根。a、b、c从键盘输

6、入,a0。分析:当输入a、b、c的值后, 若b2-4ac0,则方程有两个不同的实根; 若b2-4ac=O,则方程有两个相等的实根。 #include #include using namespace std; int main(void) float a,b,c,delta; coutabc; delta=b*b-4*a*c; if(delta=0) /使用复合语句 delta=sqrt(delta); if(delta) cout方程有两个不同的实根:; coutnx1=(-b+delta)/2/a; couttx2=(-b-delta)/2/an; else cout方程有两个相等的实根:

7、x1=x2=-b/2/an; else cout方程没有实根!n; return 0; 牛顿迭代法求根(P77第17题(1) /*迭代法求2x3-4x2+3x-6=0根*/ #include #include using namespace std; int main() double x1,x2,f1,f2; x2=1.5; do x1=x2; f1=2*pow(x1,3)-4*pow(x1,2)+3*x1-6; f2=6*x1*x1-8*x1+3; x2=x1-f1/f2; while(fabs(x2-x1)1e-8); coutx2endl; return 0; 二分法求根(P77第17

8、题(2),P116第21题、P197第14题) /*二分法求方程的2x3-4x2+3x-6=0根*/ #include #include #include using namespace std; int main() double x1=2,x2=3,x,f1,f2,f; do x=(x1+x2)/2; f1=pow(x1,3)-6*x1-1; f2=pow(x2,3)-6*x2-1; f=pow(x,3)-6*x-1; if (f1*f0) x2=x; else if(f*f20) x1=x; /以下行输出当前算出的几个相关值进行比对,实际做题时可不要此行 coutfixedsetprec

9、ision(8)x 1e-8) (f!=0)1e-8&f!=0); coutfixedsetprecision(8)xendl; return 0; /递归的方式用二分求方程的根 /方程为:x3-6x-1=0 #include #include using namespace std;double bi_root(double x1,double x2,double precision) /假定x1,x2区间肯定有解 double f1,f2,f,x; x=(x1+x2)/2; if(fabs(x2-x1)=precision) return x; f1=x1*x1*x1-6*x1-1; f2

10、=x2*x2*x2-6*x2-1; f=x*x*x-6*x-1; if(f=0) return x; if(f1*f0) return bi_root(x1,x,precision); if(f*f20) return bi_root(x,x2,precision); void main() cout指定方程的根:bi_root(1,3,1e-8)endl; /*用二分法设计一个通用函数root(),求方程f(x)=0在a,b内的一个实根(设f(a)f(b)0),要求根的精度为10-8。 并调用root()函数求x3-6x-1=0在x=2附近的一个实根。*/ #include #include

11、 using namespace std; double root(double x1,double x2,double (*f)(double) double y1,y2,x0; y1=f(x1); y2=f(x2); x0=(x1+x2)/2; if(y1*y2=0) x1=x1*2-x2; x2=x0; if(fabs(y1)1e-8 | fabs(y2)1e-8) return root(x1,x2,f); /递归求解 else return x0; double function(double x) return pow(x,3)-6*x-1; int main(void) doub

12、le a,b; coutab; coutx3-6x-1=0在x=2附近的一个实根为:root(a,b,function)endl; return 0; 弦截法求根(P327第12题) /*采用弦截法求一元n次方程f(x)=0在区间a,b(f(a)与f(b)异号)中的一个实根的算法如下: (1)取两个不同的点x1和x2若f(x1)和f(x2)异号,则区间(x1,x2)中必有一个实根。 (2)连接(x1,f(x1)和(x2,f(x2)的弦交于x轴的坐标点可用下式求出: x=(x1f(x2)-x2f(x1)/(f(x2)-f(x1) (3)若f(x)与f(x1)同号,则根必在区间(x,x2),将x作

13、为新的x1;若f(x)与f(x2)同号,则根必在区间(x1,x),将x作为新的x2。 (4)重复(2)(3)步骤,直到|f(x)|1.0E-6为止。此时x即为所求的实根。 根据上述算法,定义求任意给定方程f(x)=0在区间a,b(f(a)与f(b)异号)的实根的抽象类。并由此抽象类派生出一个求解方程x3-5x2+16x-80=0实根的新类,最终求解方程在4.5,5.5间的实根。*/ #include #include using namespace std; class root protected: float a,b; /确定区间 public: root(float a,float b)

14、 this-a=a; this-b=b; virtual double f(float x)=0; /纯虚函数,求f(x)的值 double show(); ; double root:show() float x=a; while(fabs(f(x)1E-6) x=(a*f(b)-b*f(a)/(f(b)-f(a); if(f(x)*f(a)0) a=x; if(f(x)*f(b)0) b=x; return x; class Root:public root double f(float x) return pow(x,3)-5*x*x+16*x-80; public: Root(floa

15、t a,float b):root(a,b) ; int main(void) root *a=new Root(4.5,5.5); cout实根为:show()endl; delete a; return 0; 4、求累和(P57例4.8,4.9,4.10)/用while语句求1+2+3+100的值。#includeusing namespace std;int main(void) int i=2,/待求和的当前项 s=1;/当前项前所有项的累加和 while(i=100) /A s+=i; i+; /B /或:s+=i+; /或: s+=i,i+; cout1+2+3+100=sn; r

16、eturn 0;/用dowhile语句求1+2+100。#includeusing namespace std;int main(void) int i=2, /待求和的当前项 s=1; /当前项前所有项的累加和 do s+=i+; while(i=100); cout1+2+3+100=sn; return 0;#includeusing namespace std;void main(void) int i=99, /待求和的当前项 s=100; /当前项前所有项的累加和 do s+=i-; while(i); cout1+2+3+100=sn;/用for语句求1+2+100。#inclu

17、deusing namespace std;int main(void) int i,/待求和的当前项 s;/当前项前所有项的累加和 for(i=2,s=1;i=100;i+) s+=i; cout1+2+3+100=sendl; return 0;#includeusing namespace std;void main(void) int i=2,/待求和的当前项 s=1;/当前项前所有项的累加和 for(;i=100;i+) /for(;i=100;) s+=i; / s+=i+; cout1+2+3+100=sendl;#includeusing namespace std;void

18、main(void) int i=2,/待求和的当前项 s=1;/当前项前所有项的累加和 for(;) s+=i+; if (i100) break; cout1+2+3+100=sendl;5、计算给定公式的值(P70例4.18,P77第9、11题,P116第16、19题)/编写程序,利用公式计算的近似值,直到最后一项的绝对值小于10-8为止。#include#include#includeusing namespace std;int main() double pi=0,/4的前n项的和,初值为0 t=1, /4的当前项的值,初值为1 n=1; /n表示分母 int s=1; /s表示符

19、号 while(fabs(t)=1E-8)/有效位超过了7位了,要用double型了 pi+=t; n+=2; s=-s; t=-s/n; coutfixed setprecision(8)pi*4endl; return 0;/输入一个整数,输入该整数的所有素数因子#include #include using namespace std;void main() int n,i; cout请输入一个整数:n; cout它的所有素数因子为:; i=2; while(n!=1) while(n%i!=0) i+; coutsetw(5)i; n/=i; 求e的近似值#include using

20、namespace std;int main() double e=1,n=1,k=1; do e+=1/k; n+; k*=n; while(n=10); couteeendl; return 0;6、判断或求符合条件的特殊数: 给定条件(P77第12、14题) 求出1599中能被3整除,且至少有一位数字为5的所有整数。 #include #include using namespace std; int main() int n1,n2,n3,k=0; /k用于控制每行输出10个数据 for(int i=1;i=599;i+) if(i%3) /i%3等价于i%3!=0 continue;

21、 n1=i/100; n2=i%100/10; n3=i%10; if(n1=5|n2=5|n3=5) k+; coutsetw(5)lefti; if(k%10=0) coutendl;/每行打印10个数 return 0; 求满足以下条件 3位数n:它除以11所得到的商等于n的各位数字的平方和,且其中至少两位数字相同。例如:131除以11的商为11,各位数字的平方和为11 #include using namespace std; int main() int n,n1,n2,n3; for(n=100;n=999;n+) n1=n/100; n2=n%100/10; n3=n%10; i

22、f(n1=n2|n1=n3|n2=n3) /至少有两位数字相同 if(n1*n1+n2*n2+n3*n3=n/11) coutnendl; return 0; /*/ / 以下为用穷举的方法进行的实现 / /*/ /* #include using namespace std; int main() int n1,n2,n3,i,j; /i为数的百位,j为数的十位,n1,n2,n3为据题设要求构成的数 for (i=1;i=9;i+) for(j=0;j=9;j+) n1=i*100+j*10+j; /百、十、个至少存在两位相等的情况 n2=i*100+i*10+j; n3=i*100+j*1

23、0+i; if (i*i+j*j*2=n1/11) coutn1endl; if (i*i*2+j*j=n2/11) coutn2endl; if (i*i*2+j*j=n3/11) coutn3endl; return 0; */完数(P62例4.12)、 输出1000以内所有完数。“完数”是指与其因子之和相等的数。例如6=123,即6是完数。*/#includeusing namespace std;int main(void) int i, /1000以内的一个数 j, /i的试探因子 sum;/i的因子和 for(i=2;i=1000;i+) /外层for语句 for(sum=1,j=2;j=i/2;j+)/内层for语句 if(i%j=0) sum+=j; if(sum=i) /i是完数,按指定格式输出 couti=1;

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1