返回:贺老师课程教学链接 项目要求
【项目2 - n=a!+b!+c!】
求满足条件n=a!+b!+c!的所有三位数n并输出,其中a,b,c分别为n的百、十、个位数。
[参考解答]
解法1:n为3位数,n由100循环到999,每次循环,分离出百、十、个位数,以此判断
#include
int main()
{
int n,a,b,c,sum;
int i,f;
n=100;
while(n<1000)
{
c=n%10; //个位数,
b=(n/10)%10; //十位数
a=n/100; //百位数
sum=0; //注意:每次循环都要初始化
for(f=1,i=1;i<=a;++i) f=f*i; //求 a!
sum += f;
for(f=1,i=1;i<=b;++i) f=f*i; //求 b!
sum += f;
for(f=1,i=1;i<=c;++i) f=f*i; //求 c!
sum += f; //此时sum的值为a!+b!+c!
if(sum==n) //若条件成立,则 n 就是要找的数。
printf("%d ", n);
++n; //考察下一个n
}
printf("\n");
return 0;
}
解法2:用a、b、c分别代表百、十、个位数,以此构造出n=100*a+b*10+c,按a、b、c组织循环
#include
int main()
{
int a,b,c; //分别代表百、十、个位数
int n, sum, f, i;
for(a=1; a<10; a++)
{
for(b=0; b<10; b++)
for(c=0; c<10; c++)
{
n=a*100+b*10+c;
sum=0; //注意:每次循环都要初始化
for(f=1,i=1; i<=a; ++i) f=f*i; //求 a!
sum += f;
for(f=1,i=1; i<=b; ++i) f=f*i; //求 b!
sum += f;
for(f=1,i=1; i<=c; ++i) f=f*i; //求 c!
sum += f; //此时sum的值为a!+b!+c!
if(sum==n) //若条件成立,则 n 就是要找的数。
printf("%d ", n);
}
}
printf("\n");
return 0;
}
解法3:按解法2的思路做,减少了求阶乘的次数
#include
int main()
{
int a,b,c; //分别代表百、十、个位数
int fa, fb, fc; //分别代表a、b、c的阶乘
int n, sum;
for(fa=1, a=1; a<10; a++)
{
fa*=a;
for(fb=1, b=0; b<10; b++)
{
if(b>0) fb*=b; //b为0时,fb就为1(0的阶乘为1),再乘0倒危险了
for(fc=1, c=0; c<10; c++)
{
if(c>0) fc*=c;
n=a*100+b*10+c;
sum=fa+fb+fc;
if(sum==n) //若条件成立,则 n 就是要找的数。
printf("%d ", n);
}
}
}
printf("\n");
return 0;
}
解法n:在这个程序中,求阶乘是个耗时的事,还可以想出更多优化的方案,请读者自行补充