新手守护
1199 阶乘之和
题目描述 Description
给你一个非负数整数n,判断n是不是一些数(这些数不允许重复使用,且为正数)的阶乘之和,如9=1!+2!+3!,如果是,则输出Yes,否则输出No;
输入描述 Input Description
第一行有一个整数0<m<100,表示有m组测试数据;
每组测试数据有一个正整数n<1000000;
输出描述 Output Description
如果符合条件,输出YES,否则输出NO;
样例输入 Sample Input
2
9
10
样例输出 Sample Output
YES
NO
http://judge.codingtang.com/problem/1199/
40分代码
尹宗鑫在2018-11-11 21:10:09追加了内容
路过的人都看一看
尹宗鑫在2018-11-11 21:10:32追加了内容
是一道贪心
初级启示者
int s[9]={1,2,6,24,120,720,5040,40320,362880};
给你个数组,自己考虑1!,2!,3!
赵逸凡在2018-11-11 21:17:40追加了内容
这道题你需要用计算器算
赵逸凡在2018-11-11 21:17:59追加了内容
手写数据不方便
资深守护
-
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");
-
}
修练者
- int s[11]={0,3628800,362880,40320,5040,720,120,24,6,2,1};
- int main(){
- //freopen(".in","r",stdin);
- //freopen(".out","w",stdout);
- int m,n;
- cin>>m;
- for(int i=1;i<=m;i++){
- cin>>n;
- for(int i=1;i<=10;i++){
- if(n-s[i]>=0){
- n-=s[i];
- }
- }
- if(n==0)cout<<"YES"<<endl;
- else cout<<"NO"<<endl;
- }
- //fclose(stdin);
- //fcolse(stdout);
- return 0;
- }
修练者
#include<iostream>
#include<cstdio>
using namespace std;
定义字符串s数组={0,3628800,362880,40320,5040,720,120,24,6,2,1};
int main(){
int m,n;
cin>>m;
遍历1-m;
输入n;
for(int i=1;i<=10;i++){
如果他们的差比0大
n-=s[i];
如果(输入的数等于0)
cout<<"YES"<<endl;
else if(!(输入的数等于0)&&(还有一个条件,仔细想想~~))
cout<<"NO"<<endl;
}
}
}
return 0;
}
高级光能
一枪秒了!没什么好说的!
呃呃呃,抱歉,串台了。
直接上核弹部分:
while(n--) {
cin>>m;
for(i=9;i>0;i--) {
if(m-a[i]>0)
m-=a[i];
else
if(m-a[i]==0) {
m=0; break;
}
}
望采纳!!
高级光能
一枪秒了!没什么好说的!
呃呃呃,抱歉,串台了。
直接上核弹部分:
while(n--) {
cin>>m;
for(i=9;i>0;i--) {
if(m-a[i]>0)
m-=a[i];
else
if(m-a[i]==0) {
m=0; break;
}
}
望采纳!!