一道水题

not_alone 2011-07-26 05:09:35
阶乘之和
时间限制(普通/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;
}

不知道哪里错了,求大神指点。。。
...全文
223 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
636f6c696e 2011-07-28
  • 打赏
  • 举报
回复
我觉得你的算法是正确的.
只要把cin里的n>=0改成n>0就可以了.

1! + 2! + ... + n! < n! * n < (n+1)!
not_alone 2011-07-28
  • 打赏
  • 举报
回复
那帮我做做吧~
TitanQuest 2011-07-27
  • 打赏
  • 举报
回复
果然很水
not_alone 2011-07-27
  • 打赏
  • 举报
回复
楼上的怎么没一个看懂题目意思的啊!求大神啊!
爱听空 2011-07-26
  • 打赏
  • 举报
回复
可以单独判断一下0!
AndyZhang 2011-07-26
  • 打赏
  • 举报
回复
请给出题号,通知我一下
matrixcl 2011-07-26
  • 打赏
  • 举报
回复
1. 输入为0单独判断一下
2. 0! = 1,这个可能要去掉
3. 是否允许一个数重复使用? 例如 12 = 3! + 3!
hndcwynui 2011-07-26
  • 打赏
  • 举报
回复
n=x1!+ x2!+…+ xi!(i≥1,t≥1,x≥0,xi=xj当且仅当i=j)
对任意一个n (n > 0) n = 1! + 1! + ... + 1! (n个1!) 则"YES"
如果不可以出现重复的数的阶乘, 则


#include <iostream>
using namespace std;
int a[10]={1, 2, 6, 24, 120, 720, 5040, 40320, 362880};
int main()
{
int n, i, j;
while(cin >> n){
if (n < 0)
break;
i = 9;
while (n > 0 && i > 0) {
i--;
while (i >= 0 && n < a[i])
i--;
if (i >= 0)
n -= a[i];
}
if (n == 0)
printf("YES\n");
else
printf("NO\n");
}
//system("pause");
return 0;
}
autumn1202 2011-07-26
  • 打赏
  • 举报
回复
n为0时判断错误;
c_losed 2011-07-26
  • 打赏
  • 举报
回复
样例输入


9
-1

样例输出


YES

样例都没实现 好好检查下

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧