1、常用算法,带有数学函数的分段函数求值,#include #include void main() float x,y;cinx;if(x10)y=sqrt(x+1)/(2*x*x); else if(x-1)y=x*x*x*x*x+1; elsey=3*x+1; cout“y=“y;,分离与组成数字(任意位数),P65 7,#include #include void main() int m,g,s,b,q,w,ws;cinm; ws=log10(m)+1;g=m%10;s=m/10%10;b=m/100%10;q=m/1000%10;w=m/10000;cout“ws=“wsendl;co
2、ut“zx:“;switch(ws) case 5:coutw; case 4:coutq;case 3:coutb;case 2:couts;case 1:coutg; ,coutendl“nx:“;switch(ws) case 5:coutgsbqw;break; case 4:coutgsbq;break;case 3:coutgsb;break;case 2:coutgs;break;case 1:coutg; ,分离与组成数字(任意位数),#include #include void main() int m,sz5,nxs,i,n;cinm; /*分离数字,个位放在sz0中,n是
3、数据位数*/n=0;while(m!=0) szn=m%10;m=m/10;n+;cout=0;i-)coutszi;,/*构成逆序数*/ nxs=0; for(i=0;in;i+)nxs=nxs*10+szi; cout“ nsx:“nxs;,P65 7,各类数学表达式的求和、积及组合求值,#include void main( ) int i,m,n;float x,p,q,s,ai;cinn;cinx;p=1,q=1,m= - 1,s=1;for(i=1;i=n;i+) m= - m;p*=i; ai=m*q/p;s+=ai; couts; ,前n+1项之和,各类数学表达式的求和、积及组
4、合求值,#include void main( ) int i;float s,p;s=0;p=1,i=1;while(p=1e+6) s+=p;i+;p*=i;couts; ,计算:s=1!+2!+ ,直到n!超过106为止,计算:,#include void main( ) int i,n;float s,p;cinn;s=0;p=1;for(i=1;i=n;i+) p*=i;s+=p;couts; ,求一个数的因子,对这些因子进行求和、积等类操作,#include void main( ) int m,n,gs=0,s=0;coutm;n=1;while(n=m)if(m%n=0)s+=
5、n; gs+; n+; cout“s=“s“ gs=“gs; ,任意输入一个数,找出它所有的因子并统计因子的个数及因子之和。,判断一个数是否为素数、完数、水仙花数等各类数,#include void main( ) int n,j,gs=0;coutn; j=1;gs=0;while(j=n) if(n%j=0) gs+;j+; if(gs=2)coutn“ yes“;elsecoutn“ no“; ,判断一个数n是否是素数,判断的方法之一,1,2,n之中n的因子的个数,统计:,输入n,当j=n时,n%j=0,真,gs+,假,j=1 gs=0,gs=2,真,yes,假,no,j+,判断一个数是
6、否为素数、完数、水仙花数等各类数,#include #include void main( ) int n,j,k;coutn; j=2,k=sqrt(n);while(j=k) if(n%j!=0) j+;else break; if(j=k+1)coutn“ yes“;elsecoutn“ no“; ,判断一个数n是否是素数,判断的方法之二,2,3,sqrt(n)之中的数都不是n的因子,验证:,输入n,当j=k时,n%j!=0,真,j+,假,break,j=2 k=sqrt(n),j=k+1,真,yes,假,no,退出循环时j取值,j=k+1,执行break退出,j=k,n是素数,n不是素
7、数,表达式j=k为假,判断一个数是否为素数、完数、水仙花数等各类数,#include #include void main() int n,j,k,f=1;coutn;j=2,k=sqrt(n),f=1;while(j=k)if(n%j!=0)j+;else f=0;break;if(f=1)coutn“ yes“;elsecoutn“ no“; ,判断一个数n是否是素数,设变量f,其值作为判断结果的标志 f=1 n是素数 f=0 n不是素数,输入n,当j=k时,n%j!=0,真,j+,假,f=0 break,j=2 f=1,f=1,真,yes,假,no,k=sqrt(n),判断一个数是否为素
8、数、完数、水仙花数等各类数,#include #include void main() int n,j,k,f=1;coutn;j=2,k=sqrt(n),f=1;while(j=k)if(n%j!=0)j+;else f=0;break;if(f=1)coutn“ yes“;elsecoutn“ no“; ,判断一个数n是否是素数,设变量f,其值作为判断结果的标志 f=1 n是素数 f=0 n不是素数,输入n,当j=k时,n%j!=0,真,j+,假,f=0 break,j=2 f=1,f=1,真,yes,假,no,k=sqrt(n),判断一个数是否为素数、完数、水仙花数等各类数,s=0,n%
9、i=0,for i=1 to n/2,T,s+=i,s=n,T,打印因子,for n=1 to 999,#include void main( ) int n,i,s;for(n=1;n1000;n+)s=0;for(i=1;i=n/2;i+)if(n%i=0)s+=i;if(s=n)printf(“n%d its factors are:“,n);for(i=1;i=n/2;i+)if(n%i=0)printf(“%4d“,i); ,判断n是否是完数,若m是水仙花数,则:,(2) b:m的百位数,(1) 是三位数,s:m的十位数,g:m的个位数,m=b3+s3+g3,b、s、g的范围,#in
10、clude void main( ) int m,b,s,g;for(b=1;b=9;b+)for(s=0;s=9;s+)for(g=0;g=9;g+) m=b*100+s*10+g;if(m=b*b*b+s*s*s+g*g*g)coutm“ “; ,判断一个数是否为素数、完数、水仙花数等各类数,找出所有的水仙花数。,b:19s:09g:09,若m是水仙花数,则:,(2) b:m的百位数,(1) 是三位数,s:m的十位数,g:m的个位数,m=b3+s3+g3,#include void main( ) int m,b,s,g;for(m=100;m1000;m+)g=m%10;s=m/10%1
11、0;b=m/100;if(m=b*b*b+s*s*s+g*g*g)coutm“ “; ,判断一个数是否为素数、完数、水仙花数等各类数,找出所有的水仙花数。,费波纳契数列(1,1,2,3,5,8,13),f1=f2,斐波那契数列:1 1 2 3 5.f,要求计算数列之和及平均值,直到f大于105为止,分析 1 1 2 3 5,m+,while f=1e+5,=f1+f2,f=f1+f2,f1=1,f2=1,s=2,m=2,pj=s/m 输出s及pj,s+=f,f2=f,#include void main() int f1,f2,f,s,m;float pj;f1=1,f2=1,s=2,m=2;
12、f=f1+f2;while(f=1e+5) m+;s+=f;f1=f2;f2=f; f=f1+f2;,f1,f2,f,第三项,=f1+f2,f1,f2,f,第四项,=f1+f2,f1,f2,f,第五项,f=f1+f2,pj=s*1.0/m; cout“s=“s“,pj=“pj; ,费波纳契数列(1,1,2,3,5,8,13),例:求费波纳契数列前n项,#include void main() int f1=1,f2=1,n,i; cinn; for(i=1;i=n/2;i+)coutf1tf2t;f1=f1+f2;f2=f1+f2;if(n%2) coutf1; ,#include void
13、main() int f100=1,1,i,n; cinn; for(i=2;in;i+)fi=fi-1+fi-2;for(i=0;in;i+)coutfi“ “; ,各类有规律数列,2/1,3/2,5/3,8/5,前20项之和,数列中每一项的分子用a表示,分母用b表示,第一项:,a=2 b=1,从第二项开始,分子=前项的分子+前项的分母=a+b 分母=前项的分子=a c=a; a=a+b; b=c;,#include void main( ) int a,b,c,i;float s;a=2;b=1;s=0;for(i=1;i=20;i+) s+=a*1.0/b;c=a;a=a+b;b=c;c
14、outs; ,各类有规律数列,求s=a+aa+aaa+aaaa+aa.a(n个a)的值,其中a是一个数字。例如当a为2,n为5时,求和表达式为:2+22+222+2222+22222,a和n由键盘输入。,#include void main() int a,n,count=1,sn=0,tn=0; cinan; while(count=n) tn=tn+a; sn=sn+tn; a=a*10; count+; cout“a+aa+.+aaaaa=“sn;,在某一范围内找出满足条件的数,并统计这些数的个数、和、积、最大值、最小值、平均值等,求200到300之间所有素数及平均值和素数的个数,#in
15、clude void main() int i,k,num,sum=0,m,n,gs=0;cinmn; for(k=m;k=n;k+) num=0;for(i=1;ik;i+)if(k%i=0) num+;if(num=1)coutk“ “;sum+=k; gs+;cout“n共有“gs“个素数“;cout“n平均值为:“(float)sum/gs; ,输入一组数,用结束标志结束输入,求出这些数中满足条件的数,并统计这些数的个数、和、积、最大值、最小值、平均值等,任意输入一批正数,计算其和、乘积,并统计其个数,输入负数程序结束,#include void main( ) int x,h,j,g
16、;h=0;j=1;g=0;for(cinx;x0;cinx) h+=x;g+;j*=x;cout“h=“h“,j=“j“,g=“g; ,输入一组数,用结束标志结束输入,求出这些数中满足条件的数,并统计这些数的个数、和、积、最大值、最小值、平均值等,输入一批正数,求其中偶数的平均值,输入负数时结束输入,#include void main() int num,sum=0,gs=0;cinnum; while(num0)if(num%2=0) sum+=num;gs+;cinnum;cout“共有“gs“个偶数“;cout“n平均值为:“(float)sum/gs; ,找最大公约数可用辗转相除的算
17、法,首先把两个数中大的那个数作为被除数,两数相除得一余数。将除数作为被除数,余数作为除数再作除法,得到一个新的余数。不断重复这一过程直到余数为零,这时的除数就是两个数的最大公约数。,1 r=m%n,2 若r=0,最大公约数为n,否则 :,m=n,n=r,转到1,设两数为 m、n,r=m%n,m=n,n=r,公约数是n,当r!=0时,r=m%n,算法的文字描述,算法的N-S图,m,n,r=m%n,60,36,24,36,24,12,24,12,0,最大公约数、最小公倍数,最大公约数为12,最大公约数、最小公倍数,#include void main( ) int m,n,r,p;scanf(“%d,%d“,