任何人都知道如何在C中修复此代码?

时间:2016-06-20 08:55:56

标签: c

  #include <stdio.h>
  long fac(int n);
  int judge(long n);

  int main(void)
  {
  int a, b, c, d, e, f, g, exact;
  a = b = c = d = e = f = g = 0;


  for (exact = 1; exact <= (99999); exact++)
  {
   if (judge(exact) == 1)
         if (fac(exact) == exact)
              printf("%d\n", exact);  

   if (judge(exact) == 2)
    {
      a = exact / 10;
      b = exact - a*10;
       if(fac(a)+fac(b) == exact)
           printf("%d\n", exact);
        }
   if (judge(exact) == 3)
        {
        a = exact /100;
        b = exact/10 - a*10;
        c = exact - a*100 - b*10;
        if(fac(a) + fac(b) + fac(c) == exact)
            printf("%d\n", exact);
        }
    if (judge(exact) == 4)
        {
        a = exact/1000;
        b = exact/100 - a*10;
        c = exact/10 - a*100 - b*10;
        d = exact - a*1000 - b*100 - c*10;
        if (fac(a) + fac(b) + fac(c) + fac(d) == exact)
            printf("%d\n", exact);
        }
    if (judge(exact) == 5)
        {
        a = exact/10000;
        b = exact/1000 - (a*10);
        c = exact/100 - (a*100) - (b*10);
        d = exact/10 - (a*1000) - (b*100) - (c*10);
        e = exact - (a * 10000) - (b * 1000) - (c * 100) - (d*10);
        if (fac(a) + fac(b) + fac(c) + fac(d) + fac(e) == exact)
             printf("%d\n", exact);
        }

}

return 0;
}








 long fac(int times)
{
   long sum = 1;
int i, j;    
for (i = 1; i <= times; i++)
{   
    j = i;
    sum = sum * j;
}
return sum;
}

int judge(long n)
{

int length = 1;

while (n > 1)
{
    length++;
    n = n/10;
}
return length;
}

此程序倾向于计算所有特定数字,例如abc = a!b!c! (a!是阶乘) 我已经知道只有4个数字满足这个条件,它们分别是1,2,145和40585。 但我运行我的程序,只显示1和145。 我应该怎么解决这个问题?或者你可以给我一个更聪明的方法来做到这一点?

(我建立了两个函数,fac()来计算阶乘,判断()来显示它包含多少个数字。)

非常感谢!

3 个答案:

答案 0 :(得分:1)

你的判断函数返回错误的值。你可以用2种方法纠正它。第一种方法

 int judge(long n)
 {
    int length = 0;
    while (n > 0)
    {
            length++;
            n = n/10;
    }
    return length;
 }

另一种方法是使用额外的变量int size和char str [10]。

 size = sprintf(str,"%d",exact);     // find length of digit
 if (size == 1){              // check lenght of digit == 1 

两种方法都会返回正确的结果。

答案 1 :(得分:0)

改变你的判断&#34;函数(实际上是计算位数)如下

int judge(long n) {
    int length = 0;
    while (n!=0) {
       n = n/10;
       length++;
    } 
  return length;
}

我确定它会起作用

答案 2 :(得分:0)

您的judge函数返回的值不正确。在此功能中,您可以检测到数字的数字。对于输入1,它应该返回1,对于输入5,它应该返回40585。它返回6作为第二个输入。

应该改变如下。

int judge(long n)
{

  int length = 0;

  while (n >= 1)
  {
    length++;
    n = n/10;
  }
  return length;
}