0
已解决
黄子扬
新手守护
新手守护
#include<iostream>
using namespace std;
int jc(int s)
{
int i,jc[10];
jc[1]=1,jc[2]=2,jc[3]=6,jc[4]=24,jc[5]=120,jc[6]=720,jc[7]=5040,jc[8]=40320,jc[9]=362880;
for(i=1;i<=9;i++)
if(s==jc[i])
return 1;
for(i=1;i<=8;i++)
if(s==jc[i]+jc[i+1])
return 1;
for(i=1;i<=7;i++)
if(s==jc[i]+jc[i+1]+jc[i+2])
return 1;
for(i=1;i<=6;i++)
if(s==jc[i]+jc[i+1]+jc[i+2]+jc[i+3])
return 1;
for(i=1;i<=5;i++)
if(s==jc[i]+jc[i+1]+jc[i+2]+jc[i+3]+jc[i+4])
return 1;
for(i=1;i<=4;i++)
if(s==jc[i]+jc[i+1]+jc[i+2]+jc[i+3]+jc[i+4]+jc[i+5])
return 1;
for(i=1;i<=3;i++)
if(s==jc[i]+jc[i+1]+jc[i+2]+jc[i+3]+jc[i+4]+jc[i+5]+jc[i+6])
return 1;
for(i=1;i<=2;i++)
if(s==jc[i]+jc[i+1]+jc[i+2]+jc[i+3]+jc[i+4]+jc[i+5]+jc[i+6]+jc[i+7])
return 1;
for(i=1;i<=1;i++)
if(s==jc[i]+jc[i+1]+jc[i+2]+jc[i+3]+jc[i+4]+jc[i+5]+jc[i+6]+jc[i+7]+jc[i+8])
return 1;
return 0;
}
int main()
{
int i,n,s;
cin>>n;
for(i=1;i<=n;i++)
{
cin>>s;
if(jc(s)) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}
40分,求误点
0
已采纳
李翊冉
高级守护
高级守护
我的思路是:
输入n,找一个数的阶乘刚好小于n(+1就大于那种),用n减去阶乘的值,再用剩下的数再执行上述操作,直到n为0输出YES,如果最后连1的阶乘都用了还是不能为0,则输出NO
cin>>n;
for(i=9;i>=1;i--)
if(n>=fact(i))
n-=fact(i);
if(n==0)cout<<"YES"<<endl;
else cout<<"NO"<<endl;
fact函数就是阶乘函数,int即可
int fact(int n) {
if(n==1)return 1;
return n*fact(n-1);
}
0
吴知玄
新手光能
新手光能
核心: int i=9; while(n>0) { while(jc[i]>n) { i--; } n-=jc[i]; i--; if(i==0) { break; } }
0