题目描述
给你一个非负数整数n,判断n是不是一些数(这些数不允许重复使用,且为正数)的阶乘之和,如9=1!+2!+3!,如果是,则输出Yes,否则输出No;
输入
第一行有一个整数0<m<100,表示有m组测试数据;
每组测试数据有一个正整数n<1000000;
输出
如果符合条件,输出Yes,否则输出No;
样例输入
2
9
10
9
10
样例输出
Yes
Yes
分析:
由n<1000000可以看出,此题我们可以用暴力解决此题,因为10!=3628800,已经远远大于给定的n,所以我们可以把十以内的阶乘放在一个数组里面,然后选数加和就行了,具体代码如下:
#include <stdio.h>
#include <stdlib.h>
int
main()
{
int
a[10]={1,1,2,6,24,120,720,5040,40320,362880};
int
n,i,m;
scanf
(
"%d"
,&n);
while
(n--)
{
scanf
(
"%d"
,&m);
for
(i=9;i>=0;i--)
if
(m>=a[i])
m=m-a[i];
if
(m==0)
printf
(
"Yes\n"
);
else
printf
(
"No\n"
);
}
return
0;
}
如果你想从这十个数字中任意选几个数加和后看是否等于给定的n,那么你就会发现这个工作量实在是太大了。因此我们不妨倒过来想一下,假设n1+n2+n3=n,那么n-n1-n2-n3=0;
所以核心代码
for
(i=9;i>=0;i--)
if
(m>=a[i])
m=m-a[i];
就很好的解决了这个问题。