栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

8005 阶乘的和

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

8005 阶乘的和

       约翰·冯·诺伊曼,出生于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 
#include 
#include 

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("N0n");
			continue;
		}
		for(i=10;i>=0&&n>0;i--){//用减法
			if(n>=a[i])  n-=a[i];
		}
		if(n==0) printf("YESn");
		else printf("NOn");
	}
    return 0;
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/889862.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号