您的位置:首页 > 其它

nyoj91 阶乘之和

2015-07-25 11:31 381 查看

阶乘之和

时间限制: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


方法一:


#include <stdio.h>
#include <string.h>
int main()
{
int m;
scanf("%d",&m);
int f[11];
memset(f,0,sizeof(f));  //初始化
f[1]=1;
for(int i=2;i<11;i++)
f[i]=f[i-1]*i;
while(m--){
int n;
scanf("%d",&n);
int i;
int aim=n;
int flag=10;

for(i=flag;i>0;i--)//从最大的开始减
{

if(aim>=f[i])
{
flag=i-1;
aim=aim-f[i];
}
}
if(aim==0) printf("Yes\n");
else if(aim!=0) printf("No\n");
}
return 0;
}
方法二:[/code]

#include<stdio.h>
int main()
{
int m;
scanf("%d",&m);
int k[9] = {1,2,6,24,120,720,5040,40320,362880};
while(m--)
{
int n;
scanf("%d",&n);
bool f=false;
for(int i=8;i>=0;--i)
{
if(n>=k[i]&&n>0)
n-=k[i];
if(n==0)
f=true;

}
if(f)
printf("Yes\n");
else
printf("No\n");
}
return 0;
}

算出阶乘,从不大于n的最大阶乘开始想减,如果结果为0;就是符合的。[/code]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: