递归;
实际用不上,见注释掉的:
// ZOJ2358.cpp : 定义控制台应用程序的入口点。
//
#include <iostream>
#include <string>
using namespace std;
int fab(int n)
{
if(n==0)return 1;
int sum=1;
for(;n>=1;n--)sum*=n;
return sum;
}
int getMax(int n)
{
int sum=1,i=1;
while(sum<=n)
{
i++;
sum*=i;
}
return i-1;
}
bool canFabbed(int n,int last)
{
if(n==0)return true;
if(last==1)
{
if(n<=2)return true;
return false;
}
if(fab(last)>n)
{
return canFabbed(n,last-1);
}
return canFabbed(n-fab(last),last-1);
}
int main()
{
int n;
string s;
while(1)
{
cin>>n;
if(n<0)break;
if(n==0){cout<<"NO"<<endl;continue;}
s=canFabbed(n,getMax(n))?"YES":"NO";
cout<<s<<endl;
/*int i=getMax(n);
for(;i>=0&&n>0;i--)
{
if(n>=fab(i))n-=fab(i);
}
if(n!=0)cout<<"NO"<<endl;
else cout<<"YES"<<endl;
*/
}
return 0;
}