一道水题
阶乘之和
时间限制(普通/Java):5000MS/10000MS 运行内存限制:65536KByte
总提交:143 测试通过:41
描述
约翰(1903,12,28-1957,2,8)出生于纽曼,是一个在数学、逻辑、量子物理学、气象学、科学,计算机和游戏理论的基础研究方面有重要的贡献的匈牙利-美国数学家。 他以惊人的记忆和理解及解题速度而闻名。在 1925 年,他获得了苏黎士学院的化学工程学位,在 1926 年获得布达佩斯大学的数学博士学位,他的博士论文在集合论上做出了一个重要的贡献。 在 他20岁的时候, 他提出的一种顺序数字定义被广泛采用。 当在他的二十几岁的时候, 他在纯数和应用数学方面作了许多贡献,为他成为数学家建立了深厚的基础。
他的量子力学 (1932) 的数学基础为新的科学训练建立了坚硬的架构。 在这次期间,他也证明游戏理论的最小-最大定理。 他逐渐地在游戏理论中扩大了他的工作,而且与合作者 Oskar Morgenstern写了游戏和经济的行为理论(1944)。
有一些数,可以表示成一些阶乘的和。例如9,9=1!+2!+3!。约翰对这样的数非常有兴趣。因此,他给你一个数n,并且要求你告诉他是否该数可以表示成几个数的阶乘的和。
这是非常简单的。对于给定的n,你只需检查是否有一些Xi,当n=x1!+ x2!+…+ xi!(i≥1,t≥1,x≥0,xi=xj当且仅当i=j),如果存在,就说“YES”,否则打印“NO”。
输入
输入文件由非负整数n(n<=1,000,000),每一行一个数。输入以负数结束。
输出
对每一个n,打印“YES”或“NO”。每行一个。没有多余的空格。
样例输入
9
-1
样例输出
YES
下面是我的代码:
#include <iostream>
using namespace std;
int a[10]={1,1,2,6,24,120,720,5040,40320,362880};
int main()
{
int n,i;
while(cin>>n,n>=0)
{
bool flag=false;
for(i=9;i>=0;i--)
{
if(n>=a[i])
n-=a[i];
if(n==0)
flag=true;
}
if(flag)cout<<"YES"<<'\n';
else cout<<"NO"<<'\n';
}
system("pause");
return 0;
}
不知道哪里错了,求大神指点。。。