C语言编程练习27:阶乘的和

题目描述

有些数可以表示成若干个不同阶乘的和。例如,9=1!+2!+3!。小明对这些数很感兴趣,所以他给你一个正整数n,想让你告诉他这个数是否可以表示成若干个不同阶乘的和。

输入

输入包含多组测试数据。每组输入为一个非负整数n(n<=1000000),当n为负数时,输入结束。

输出

对于每组输入,如果n可以表示成若干个不同阶乘的和,则输出YES,否则输出NO。

样例输入 Copy

9
-1

样例输出 Copy

YES


思路:先算出小于1000000的最大阶乘数T,然后把0到T的每个阶乘值存入数组。用输入的N依次减去小于它的阶乘值,如果最后差为0则为YES,否则为NO。
#include <stdio.h>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>


#include<cstdio>
using namespace std;


int main()
{
	int a[11];
	int n,c=0;
	a[0]=1;
	for(int i = 1;i<11;i++)
	{
		a[i]=1;
		for(int j = 1;j<=i;j++)
		{
			a[i] = a[i]*j;
		}
		if(a[i]>1000000)
		{
			c=i-1;
			break;
		}
	}
	while(scanf("%d",&n)!=EOF)
	{
		if(n<0)
		{
			break;
		}
		if(n==0)
		{
			printf("NO
");
			continue;
		}
		for(int i = c ;i>=0;i--)
		{
			if(n>=a[i])
			{
				n=n-a[i];
			}
		}
		if(n==0)
		{
			printf("YES
");
		}
		else
		{
			printf("NO
");
		}
	}
	return 0;
}
 
原文地址:https://www.cnblogs.com/FantasticDoubleFish/p/14320636.html