约翰·冯·诺伊曼,出生于1903年12月28日,1957年2月8日去世,是一个美籍匈牙利数学家,他在数学,逻辑,量子物理学,气象学,科学,电脑和游戏理论等基础做出了重要贡献。他具有惊人的记忆,快速理解能力和解决问题的能力。在1925年,他获得苏黎世学院化学工程专业学士学位,1926年就获得布达佩斯大学数学博士文凭。他的关于集合理论的博士论文是该学科的一个重要贡献。20岁的冯·诺伊曼提出了一种新序数定义,后来被普遍采用。虽然他才20多岁,他在纯理论和应用数学领域做出了很多贡献,确立了他作为一个数学家不寻常的深度。他的数学基础量子力学(1932)为新的科学学科建立了一个坚实的框架。在这段时间里,他也证明了博弈论的最小最大定理。他在博弈论中逐渐扩大他的工作,并和奥斯卡·摩根斯坦合著了游戏论与经济行为(1944)。
总有些数字可以表示为阶乘的总和。例如,9 = 1!+ 2!+ 3!。冯·诺伊曼博士对这样的数字很感兴趣。于是,他给你一个数n,想让你能告诉他这个数是否可以表示一些阶乘的总和。
好吧,这只是小菜一碟。对于给定的n,你会检查是否有一些xi,让n等于SUM {xi}(1 <= i<= t,t> = 1,xi> = 0,xi=xj 当且仅当i=j)。如果答案是肯定的,则输出“YES”,否则打印出“NO”。
输入:
你将得到一些非负的整数n (n <= 1,000,000) ,每个数占一行。负数表示输入结束。
输出:
对于每个n,你要输出"YES" 或 "NO"),没有额外的空格。
输入样例:
9
-1
输出样例:
YES
解题分析:n要求≤1000000,而10!=3628800,所以将1!~10!进行逐一尝试即可。值得注意的是,n被拆为几个数字阶乘的形式,要求这几个数字不相等。采取减法的形式进行验证,如果n>某个数字的阶乘,则用n减去它,然后剩下的数字再重复这步先比较再减去的操作,如果最后的结果为0,则表示n可以被不同数字的阶乘之和来表示。
代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
int n,i;
int a[11];
a[0]=1;
int sum=0;
for(i=1;i<11;i++) a[i]=a[i-1]*i;//计算1~10的阶乘
while(scanf("%d",&n)!=EOF){
if(n<0) break;
if(n==0){
printf("N0\n");
continue;
}
for(i=10;i>=0&&n>0;i--){//用减法
if(n>=a[i]) n-=a[i];
}
if(n==0) printf("YES\n");
else printf("NO\n");
}
return 0;
}