http://acm.nyist.net/JudgeOnline/problem.php?pid=91
阶乘之和
时间限制:
3000 ms | 内存限制:
65535 KB
难度:
3
-
描述
-
给你一个非负数整数n,判断n是不是一些数(这些数不允许重复使用,且为正数)的阶乘之和,如9=1!+2!+3!,如果是,则输出Yes,否则输出No;
-
输入
-
第一行有一个整数0<m<100,表示有m组测试数据;
每组测试数据有一个正整数n<1000000;
输出
- 如果符合条件,输出Yes,否则输出No; 样例输入
-
2 9 10
样例输出
-
Yes No
-
-
#include<stdio.h> #include<string.h> #define MAX 15 int a[MAX]; int main() { int i,j,k; memset(a,0,sizeof(a)); for(i=2,a[1]=1;i<MAX;i++)//把1~MAX-1的阶乘放到a[]数组中 a[i]=a[i-1]*i; int M,N,n; scanf("%d",&M); while(M--) { scanf("%d",&N); n=N;//主要是用于1,当N==1时,成立 for(i=MAX-1;i>=1;i--)//判断到小于等于N时,N=N-a[i] if(N>=a[i]) break; for(N-=a[i],i-=1,k=0;i>=1;i--)//从i~1的阶乘依次扫描,当小于N时,N-=a[i]。当N==0或者i<1时跳出 { if(N>=a[i]) N-=a[i]; if(N==0) { k=1; break; } } if(k==1||n==1) printf("Yes\n"); else printf("No\n"); } return 0; }
-
第一行有一个整数0<m<100,表示有m组测试数据;