阶乘之和
描述
给你一个非负数整数n,判断n是不是一些数(这些数不允许重复使用,且为正数)的阶乘之和,如9=1!+2!+3!,如果是,则输出Yes,否则输出No;
-
输入
-
第一行有一个整数0<m<100,表示有m组测试数据;
每组测试数据有一个正整数n<1000000;
输出
- 如果符合条件,输出Yes,否则输出No; 样例输入
-
29
-
10
样例输出
-
Yes
-
No
#include<stdio.h>
int main()
{
int n,m;
scanf("%d",&m);
while(m--)
{
scanf("%d",&n);
int jiecheng[10]= {1,2,6,24,120,720,5040,40320,362880}; //数字1-9的阶乘
for(int i=8; i>=0; i--)
{
if(n>=jiecheng[i])
n=n-jiecheng[i];
}
if(n==0)
printf("Yes\n");
else
printf("No\n");
}
return 0;
}
方法二:
#include<stdio.h>
int digui(int a)
{
if(a==1)
return 1;
else
return digui(a-1)*a;
}
int main()
{
int n;
scanf("%d",&n);
while(n--)
{
int m,i,j,s,flag=0;
scanf("%d",&m);
for(i=1; digui(i)<=m; i++)
{
s=0;
for(j=i; j>0; j--)
{
if(s+digui(j)>m)
continue;
else
s+=digui(j);
if(s==m)
{
flag=1;
break;
}
}
}
if(flag)
printf("Yes\n");
else
printf("No\n");
}
return 0;
}
ps:这个题也让我简单的了解了递归。。