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; }