zoj 2358,poj 1775 Sum of Factorials(数学题)

题目poj

题目zoj

//我感觉是题目表述不确切,比如他没规定xi能不能重复,比如都用1,那么除了0,都是YES了
//算了,这种题目,百度来的过程,多看看记住就好
//题目意思:判断一个非负整数n能否表示成几个数的阶乘之和
//这里有一个重要结论:n!>(0!+1!+……+(n-1)!),
//证明很容易,当i<=n-1时,i!<=(n-1)!,故(0!+1!+……+(n-1)!)<=n*(n-1)!=n!.
//     由于题目规定n<=1000000,而10!=3628800>100000,故只需保存前10项的阶乘.
//       有两个需要注意的地方:1>如果题目输入0,按照上面的方法处理得到的结果是"YES",
//而按照题目的意思应该输出"NO",所以需要特别处理.
//              2>题目输入结束的方法是以如果输入的数为负数就结束输入.

//10! = 3628800 > 1000000
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;

int main()
{
    int n,i;
    int fact[11];//这里还是要开的大一点。。因为下标从0开始
    fact[0]=1;
    for(i=1;i<=10;i++)
        fact[i]=fact[i-1]*i;
    
    while(scanf("%d",&n)!=EOF)
    {
        if(n<0) break;
        if(n==0)
            printf("NO
");
        else {
                for(i=10;i>=0;i--) //之前错了,是这样的:0!=1 ,也算进去的
                {
                    if(n-fact[i]>=0)
                        n-=fact[i];
                }
            if(n==0)
                printf("YES
");
            else
                printf("NO
");
        }
    }
    return 0;
}
View Code
一道又一道,好高兴!
原文地址:https://www.cnblogs.com/laiba2004/p/3817839.html