题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=2212
Problem Description
A DFS(digital factorial sum) number is found by summing the factorial of every digit of a positive integer.
For example ,consider the positive integer 145 = 1!+4!+5!, so it’s a DFS number.
Now you should find out all the DFS numbers in the range of int( [1, 2147483647] ).
There is no input for this problem. Output all the DFS numbers in increasing order. The first 2 lines of the output are shown below.
问题描述
通过对正整数的每个数字的阶乘求和来找到DFS(数字阶乘和)数。
例如,考虑正整数145 = 1!+4!+5 !,因此它是DFS编号。
现在你应该找到int([1,2147483647])范围内的所有DFS数字。
这个问题没有输入。按递增顺序输出所有DFS编号。输出的前两行如下所示。
输入
没有输入
输出
以递增顺序输出所有DFS编号。
分析:
1.循环从1开始
2.范围是[1,2147483647] ,该范围内最大的阶乘和为9个9 其和为3265920 所以只需要遍历到3265920 即可
3.0的是1
样本输出
1
2
…
作者
ZJT
运行代码:
1.普通方法:
#include<Stdio.h>
#include<String.h>
#include<math.h>
int main()
{
long long i,n[15],num,j,t,value,c;
for(int i=1;i<=3265920;i++) //该范围内最大的阶乘和为9个9 其和为3265920 所以只需要遍历到3265920 即可
{
t=i; //方便最后的比较
num=0; //数字位数
value=0; //阶乘和
while(t) //t=0 退出
{
n[num]=t%10; //获取每位上数字
if(n[num]==0) //判断每位上数字是不是0
value+=1; //是0的话 阶乘和+1
else //不是的话 正常计算即可
{
c=1;
for(j=1;j<=n[num];j++)//获得该数的阶乘
c*=j;
value+=c;
}
t/=10; //为了获取下一位数字
num++;
}
if(i==value) //如果是DFS
printf("%d\n",i);
}
return 0;
}
2.dfs
#include<Stdio.h>
#include<String.h>
#include<math.h>
int dfs(int m)
{
long long n[15],num,j,t,value,c;
if(m>3265920)//该范围内最大的阶乘和为9个9 其和为3265920 所以只需要遍历到3265920 即可
return 0;
t=m; //方便最后的比较
num=0; //数字位数
value=0; //阶乘和
while(t) //t=0 退出
{
n[num]=t%10; //获取每位上数字
if(n[num]==0) //判断每位上数字是不是0
value+=1; //是0的话 阶乘和+1
else //不是的话 正常计算即可
{
c=1;
for(j=1;j<=n[num];j++)//获得该数的阶乘
c*=j;
value+=c;
}
t/=10; //为了获取下一位数字
num++;
}
if(m==value) //如果是DFS
printf("%d\n",m);
dfs(++m);
}
int main()
{
dfs(1);
return 0;
}
运行结果:
总结:
如果遍历到2147483647,则时间超限。该题也要注意0的阶乘是1.