题目来源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.

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐