阶乘之和
时间限制:3000 ms | 内存限制:65535 KB
难度:3
描述
-
给你一个非负数整数n,判断n是不是一些数(这些数不允许重复使用,且为正数)的阶乘之和,如9=1!+2!+3!,如果是,则输出Yes,否则输出No;
输入
-
第一行有一个整数0<m<100,表示有m组测试数据;
每组测试数据有一个正整数n<1000000;
输出
-
如果符合条件,输出Yes,否则输出No;
样例输入
-
2910
样例输出
-
YesNo
-
这题被规定为贪心,但我第一想法竟是搜索,,那就搜索写了!
-
dfs代码:
-
#include<stdio.h>
int a[11];
int n,mark;
void dabiao()//打表,求出阶乘的值,题目要求十分弱,到11就行了!
{
int i,j,sum;
for(i=1;i<11;i++)
{
sum=1;
for(j=1;j<=i;j++)
{
sum*=j;
}
a[i]=sum;
}
}
void dfs(int t,int m,int a[])
{
if(t>10||m>n)//出口
return ;
if(m==n)
{
mark=1;
return ;
}
dfs(t+1,m+a[t],a);//加入当前的阶乘值
dfs(t+1,m,a);//不加入
}
int main()
{
int t;
dabiao();
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
mark=0;
dfs(1,0,a);
if(mark)
printf("Yes\n");
else
printf("No\n");
}
return 0;
}
阶乘之和
时间限制:3000 ms | 内存限制:65535 KB
难度:3
给你一个非负数整数n,判断n是不是一些数(这些数不允许重复使用,且为正数)的阶乘之和,如9=1!+2!+3!,如果是,则输出Yes,否则输出No;
-
输入
-
第一行有一个整数0<m<100,表示有m组测试数据;
每组测试数据有一个正整数n<1000000;
输出
- 如果符合条件,输出Yes,否则输出No; 样例输入
-
2910
样例输出
-
YesNo
-
这题被规定为贪心,但我第一想法竟是搜索,,那就搜索写了!
-
dfs代码:
-
#include<stdio.h> int a[11]; int n,mark; void dabiao()//打表,求出阶乘的值,题目要求十分弱,到11就行了! { int i,j,sum; for(i=1;i<11;i++) { sum=1; for(j=1;j<=i;j++) { sum*=j; } a[i]=sum; } } void dfs(int t,int m,int a[]) { if(t>10||m>n)//出口 return ; if(m==n) { mark=1; return ; } dfs(t+1,m+a[t],a);//加入当前的阶乘值 dfs(t+1,m,a);//不加入 } int main() { int t; dabiao(); scanf("%d",&t); while(t--) { scanf("%d",&n); mark=0; dfs(1,0,a); if(mark) printf("Yes\n"); else printf("No\n"); } return 0; }