题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=91
不说这道题怎么难了,我是明明知道算法,但是我用代码实现时真的感觉好困难,特写此博客。 我自己写的代码:
#include<stdio.h>
main()
{
int i,j,s=1,a[15],m,f;
for(i=1;i<10;i++)
{
s=i*s;
a[i]=s;
}
scanf("%d",&f);
while(f--){
scanf("%d",&m);
int biaoji=10;
while(m>0)
{
for(i=0;i<biaoji;i++)
{
if(m<a[i])
{
biaoji=i-1;
break;
}
if(i==biaoji-1)
biaoji=i-1;
}
biaoji=i-1;
m=m-a[i-1];
if(m==0)
{
printf("Yes\n");
break;
}
if(biaoji==1)
{
if(m==0)
{
printf("Yes\n");
break;
}
else
{
printf("No\n");
break;
}
}
}
}
}
后来看了看别人的代码,再写时:
#include<iostream>
using namespace std;
int main()
{
int n;
int k[9]={1,2,6,24,120,720,5040,40320,362880};
cin>>n;
while(n--)
{
bool flag=false;
int m;
cin>>m;
for(int i=8;i>=0;i--)
{
if(m>=k[i] && m>0)
m-=k[i];
if(m==0)
flag=true;
}
if(flag)
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
}
}
这时才发现自己的代码能力是多么的弱,看来得时加油了