阶乘之和
时间限制: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解题思路:该题可以用搜索,设一个数为n,先找出n中包含的最大阶乘,假设为m,则从m起到1,逐个搜索
直到找到结果为止 。
代码如下:
# include<stdio.h>
# include<string.h>
int k,n,m;
int a[1005];
int w(int m) //求阶层乘
{ int k=1;
for(int i=1;i<=m;i++)
k*=i;
return k;
}
void dfs(){
if(n==0) //若为0,说明找到
{
k=1;
return ;
}
else if(n<0) return ;
for(int i=m;i>=1;i--)
if(n>0&&!a[i]) //a[i],未标记,防止重复
{
int p=w(i); //求出i的阶乘
n-=p;
a[i]=1;
dfs();
a[i]=0;
n+=p;
}
return ;
}
int main(){
int t;
scanf("%d",&t);
while(t--)
{ int i,j=1;
memset(a,0,sizeof(a));
k=0;
scanf("%d",&n);
for(i=1;;i++)
{
j*=i;
if(j>n) break;
}
m=i-1; //找到n包含的最大阶乘和
dfs();
if(k) printf("Yes\n");
else printf("No\n");
}
return 0;
}