看完题想的是,从1到2147483647遍历一遍,输出符合条件的数,然后发现超时了。
2147483647这个数字21亿,十位数字,比较大。所以想办法简化问题。
我们考虑一个极端情况,999999999十个9,阶乘和是10*9! = 3628800。
也就是说,从1到21亿,符合条件的数字,不会超过3628800。
于是,代码如下:
#include <iostream>
using namespace std;
int fact[] = {1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880};
bool isDFS(int n)
{
int sum = 0;
int t = n;
int j = 0;
while(t != 0)
{
j = t % 10;
sum += fact[j];
if(sum > n) return 0;
t /= 10;
}
if(sum == n)
{
return 1;
}
else
{
return 0;
}
}
int main()
{
for(int i=1; i<=3628800; i++)
{
if(isDFS(i)) printf("%d\n", i);
}
return 0;
}