获取三位数字,其中数字的阶乘总和等于数字

时间:2014-04-18 17:40:05

标签: algorithm

我正在读学校的组合书,不得不做一些练习,这是其中之一:

编写一个计算机程序,以确定是否存在abc (= 100a + 10b + c)的三位数整数abc = a! + b! + c!

我的尝试如下。

有人可以为此任务提出更好(更快)的算法吗?

int power(int n)
{
    int sum=1;
    for(int i=2;i<=n;i++){
        sum*=i;
    }
    return sum;
}

void compute()
{
    int abc;
    int powa,powb,powc;
    for(int a=1;a<100;a++){
        for(int b=1;b<100;b++){
            for(int c=1;c<100;c++){
                abc=(100*a)+(10*b)+c;
                powa=power(a);
                powb=power(b);
                powc=power(c);
                if(abc==(powa+powb+powc)){
                    cout<<"There is ,nums are :"<<a<<","<<b<<","<<c<<endl;
                }
            }
        }
    }
}

int main()
{
    compute();
    return 0;
}

2 个答案:

答案 0 :(得分:5)

for (var n = 0; n < 1000; n++)
{
   var a = (n / 100);
   var b = (n / 10) % 10;
   var c = n % 10;

   var m = a! + b! + c!;

   if (m == n)
   {
      Console.WriteLine(n);
   }
}

如果您不想考虑前导零,可能从100开始。或者这样。

for (var a = 0; a < 10; a++)
{
   for (var b = 0; b < 10; b++)
   {
      for (var c = 0; c < 10; c++)
      {
         var n = 100 * a + 10 * b + c;
         var m = a! + b! + c!;

         if (m == n)
         {
            Console.WriteLine(n);
         }
      }
   }
}

如果你不想要前导零,也可以跳过零。如果您确定m将始终大于n,您也可以提前退出循环。例如,abc不能大于6,因为7!大于999。

答案 1 :(得分:2)

我们在开始时有900个可能的数字。遵守规则我们可以注意到以下几点:

7!,8!和9!大于999,所以不能使用它们。这使我们减少到294个可能的数字。

0!,1!,2!,3!和!4都小于25.这意味着你使用的三个数字中至少有一个必须是五或更大。这将其减少到194个可能的数字。

既然我们已经在纸上消除了大量案件,我们需要检查它们。我们不是一直计算阶乘,而是为每个数字0-6计算一次,并将它们保存在一个数组中。

然后对于每个组合三个数字0-6(第一个为1),其中至少有一个 大于4,我们检查它是否符合条件a!+ b!+ c!= a * 100 + b * 10 + c。

可能还有其他一些方法可以对其进行优化,但考虑到你只有3位数(这是一个非常少的可能情况),即使这样也是过度的。

int factorials[7];

int factorial(int n)
{
    if(n<2)return n;
    else return n*factorial(n-1);
}

void check(int a, int b, int c)
{
    if((a>4 || b>4 || c>4) && factorials[a]+factorials[b]+factorials[c]==a*100+b*10+c)
    cout<<"There is, nums are : "<<a<<","<<b<<","<<c<<endl;
}

int main()
{
    for(int i=0;i<7;i++)factorials[i]=factorial(i);
    for(int a=1;a<7;a++)
        for(int b=0;b<7;b++)
            for(int c=0;c<7;c++)check(a,b,c);
    return 0;
}