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\n");
continue;
}
for(int i = c ;i>=0;i--)
{
if(n>=a[i])
{
n=n-a[i];
}
}
if(n==0)
{
printf("YES\n");
}
else
{
printf("NO\n");
}
}
return 0;
}

浙公网安备 33010602011771号