我正在读学校的组合书,不得不做一些练习,这是其中之一:
编写一个计算机程序,以确定是否存在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;
}
答案 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
,您也可以提前退出循环。例如,a
,b
和c
不能大于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;
}