nyoj_91 阶乘之和

阶乘之和

时间限制: 3000 ms  |  内存限制: 65535 KB
难度: 3
描述

给你一个非负数整数n,判断n是不是一些数(这些数不允许重复使用,且为正数)的阶乘之和,如9=1!+2!+3!,如果是,则输出Yes,否则输出No;

输入
第一行有一个整数0 每组测试数据有一个正整数n<1000000;
输出
如果符合条件,输出Yes,否则输出No;
样例输入
2
9
10
样例输出
Yes
No

分析:

10!=3628800>1000000,所以此题只需要用到1!~9!,数据量很小,先打表存储1!~9!这9个数字。

由于m之前所有阶乘之和一定小于m!,所以只要从大到小遍历,每检索到一个比m小的,就让m减去这个数;

最后如果m为0,则Yes,否则No

代码:

#include
int map[9];
void fun()
{
	map[0]=1;
	for(int i=1;i<9;i++)
		map[i]=map[i-1]*(i+1);
} 
int main()
{
	fun();
	int T;
	scanf("%d",&T);
	while(T--)
	{
		int n;
		scanf("%d",&n);
		for(int i=8;i>=0;i--)
			if(n>=map[i])
				n-=map[i];
		if(!n)
			printf("Yes\n");
		else
			printf("No\n");
	}
	return 0;
}


你可能感兴趣的:(贪心算法)