南阳oj第91题(阶乘之和)

来源:互联网 发布:qq抢红包软件 编辑:程序博客网 时间:2024/06/16 08:23
描述

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

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

分析:可将n减去小于n的最大的阶乘,判断减去后的值是否为0,若为0,则符合条件,若不为0,再将减去得到的数再减去小于其的最大阶乘,再进行判断,直至减去后所得的数前最大阶乘为1的阶乘,若还不为0,则一定不满足条件。

#include <stdio.h>int N(int a){int sum = 0;if(a == 0)return (1);elsesum = a*N(a-1);return sum;}int main(){int n, m, i, b;scanf("%d", &m);while(m--){scanf("%d", &n);for(i = 10; i >= 0; i--){if(N(i) <= n){n -= N(i);} if(i == 0){printf("No\n");break;}if(n == 0) //0的阶乘为 1 ; {printf("Yes\n");break;}}}return 0; }