标签:style blog http color os art
//我感觉是题目表述不确切,比如他没规定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\n"); else { for(i=10;i>=0;i--) //之前错了,是这样的:0!=1 ,也算进去的 { if(n-fact[i]>=0) n-=fact[i]; } if(n==0) printf("YES\n"); else printf("NO\n"); } } return 0; }
zoj 2358,poj 1775 Sum of Factorials(数学题),布布扣,bubuko.com
zoj 2358,poj 1775 Sum of Factorials(数学题)
标签:style blog http color os art
原文地址:http://www.cnblogs.com/laiba2004/p/3817839.html