c语言an a n 1 b,《C语言及程序设计》实践参考——n=a!+b!+c!

返回:贺老师课程教学链接  项目要求

【项目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:在这个程序中,求阶乘是个耗时的事,还可以想出更多优化的方案,请读者自行补充

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值