![]() ![]() |
|
C趣味程序(二)(04)求所有阶乘和数 | |
作者:佚名 文章来源:不详 点击数 更新时间:2008/4/18 13:58:57 文章录入:杜斌 责任编辑:杜斌 | |
|
|
算法分析如下: 设阶乘和数的位数为n,n可以为1,2... 容易证明:n<8 事实上,若阶乘和数达到8位(或更大),阶乘和最大(即设定每位数字都为9)也要比最小的8位数小,即: 8X9!=8*362880<10000000 由此可见,阶乘和数最多只能为7位 设置a,b,c,d,e,f,g共7重循环,在所有1~7位整数中搜索,寻找满足阶乘和条件的数,这样可找出所有阶乘和数。 程序代码如下: #include<stdio.h> long jc(int x); void main() { int a,b,c,d,e,f,g; long m1,m2,m3,m4,m5,m6,n1,n2,n3,n4,n5,n6; printf("所有阶乘和数有: "); for(a=1;a<=9;a++) { if(a==jc(a)) printf("%d ",a); /*1位数a满足条件则输出*/ for(b=0;b<=9;b++) { m1=a*10+b; n1=jc(a)+jc(b); if(m1==n1) printf("%ld ",m1); /*判别2位数m1*/ for(c=0;c<=9;c++) { m2=m1*10+c; n2=n1+jc(c); if(m2==n2) printf("%ld ",m2); /*判别3位数m2*/ for(d=0;d<=9;d++) { m3=m2*10+d; n3=n2+jc(d); if(m3==n3) printf("%ld ",m3); /*判别4位数m3*/ for(e=0;e<=9;e++) { m4=m3*10+e; n4=n3+jc(e); if(m4==n4) printf("%ld ",m4); /*判别5位数m4*/ for(f=0;f<=9;f++) { m5=m4*10+f; n5=n4+jc(f); if(m5==n5) printf("%ld ",m5); /*判别6位数m5*/ for(g=0;g<=9;g++) { m6=m5*10+g;
n6=n5+jc(g); if(m6==n6) printf("%ld ",m6); /*判别位数m6*/ }}}}}}} } long jc(int x) { int i; long p=1; for(i=1;i<=x;i++) p*=i; return p; } 程序运行结果为: 所有阶乘和数有: 1 145 2 40585 可见阶乘和数一共只有4个,其中1,2是显而易见的。 |
|
![]() ![]() |