问题标题: 酷町堂:1199

0
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
我要回答