首页 > 教育

求一个三位数它的各个位的数字的阶乘的和等于其本身,请使用函数完成

更新时间2021-06-30 05:43:32

请问这个代码哪里有问题,初学者 请大佬解答一下
#include <stdio.h>
 
void main()
 
{  
  int a,b,c,d,num,num1,num2,num3;
 for(a=100;a<1000;a++)
  {
                for (b=1;b<a/100;b++)  //百位阶乘
                       num1=1;
                       num1*=b;
               for (c=1;c<a/10%10;c++)   //十位阶乘
                      num2=1;
                      num2*=c;
               for(d=1;d<a%10;d++)  //个位阶乘
                     num3=1; 
                     num3*=d;
                     num=num1+num2+num3;  //阶乘相加
               if(a==num)   //判断是否相等 
               {
                 printf("%d ",a);
                }
 }   
}

问题1、b<a/100、c<a/10%10、d<a%10,意味着 b < 9,c < 9,d < 9,这样888以上的数就无法验证了;


问题2、c = 1、d = 1,当 a 的十位或个位是 0、1 时,不满足 c<a/10%10、d<a%10,循环体不执行,所以 十位或个位是 0、1的数无法验证;


因为 0! = 1,有意义,所以不应忽略十位或个位是 0 的数 。


同样,b = 1,百位是 1 时,不满足 b<a/100 ,循环体不执行,所以 百位是 1 的数无法验证;


本题正确答案是 145,恰好百位是1,所以程序运行得不到正确答案。


故3个循环语句应改为 for (b=1;b<=a/100;b++)  //百位阶乘
for (c=0;c<=a/10%10;c++)   //十位阶乘
for(d=0;d<=a%10;d++)  //个位阶乘

在后两个循环体中,当 c = 0,或 d = 0 时,要用 if  语句使 num2 或 num3 直接等于 1 ,不参与阶乘。否则 num2 或 num3 恒等于 0;

这个三位数是145【唯一】

1!+4!+5!=1+24+120=145

上一篇:用一元二次方程解

下一篇:已知X~N(1,σ^2),P(-1