这道题巧妙的地方在于输入的数一定在100 0000 以内,根据阶乘数据估算,很快就会超过这个数据规模,所以我把所有没有超过数据规模的计算出来,之后进行排列组合 即每次从中选取x个数字进行累加,存入一个数组中,这样在输入的时候直接把输入数据和数组中的数据进行比较即可
比较坑的地方在于非负整数包含0,所以还要加一再存一遍或者在判断时候加入一些-1的判断语句
代码堆垃圾。。抛砖引玉了
#include <iostream>
#include <algorithm>
#include <stack>
#include <queue>
#include <vector>
#include <cstring>
#include <cmath>
#include <cstdlib>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
using namespace std;
//这道题转化为判断一个数能否由1-9的阶乘 加起来
//9 + C92 + C93 +C94 +C95 +C96 +C97 +C98 +C99
// 1 9 36 84 126 126 84 36 9 1 一共有这么多种情况
int main(int argc, char** argv) {
int count = 0;
int aa[3005] = {0};
for(int i=1;i<10;i++)
{
long long a = 1;
for(int j=1;j<=i;j++)
{
a *= j;
}
aa[count++] = a;
// printf("%d\n",a);
}
for(int i=0;i<9;i++)//两个数位加起来的情况
{
for(int j=i+1;j<9;j++)
{
aa[count++] = aa[i] + aa[j];
}
}
// printf("count = %d\n",count);
// for(int i=0;i<count;i++)
// {
// printf("%lld\n",aa[i]);
// }
for(int i=0;i<9;i++)
for(int j=i+1;j<9;j++)
for(int k=j+1;k<9;k++)
aa[count++] = aa[i] + aa[j] + aa[k];
for(int i=0;i<9;i++)
for(int j=i+1;j<9;j++)
for(int k=j+1;k<9;k++)
for(int l=k+1;l<9;l++)
aa[count++] = aa[i] + aa[j] + aa[k] + aa[l];
// printf("count = %d",count);
// for(int i=0;i<count;i++)
// {
// printf("%lld\n",aa[i]);
// }
for(int i=0;i<9;i++)
for(int j=i+1;j<9;j++)
for(int k=j+1;k<9;k++)
for(int l=k+1;l<9;l++)
for(int m=l+1;m<9;m++)
aa[count++] = aa[i] + aa[j] + aa[k] + aa[l] + aa[m];
for(int i=0;i<9;i++)
for(int j=i+1;j<9;j++)
for(int k=j+1;k<9;k++)
for(int l=k+1;l<9;l++)
for(int m=l+1;m<9;m++)
for(int n=m+1;n<9;n++)
aa[count++] = aa[i] + aa[j] + aa[k] + aa[l] + aa[m] + aa[n];
for(int i=0;i<9;i++)
for(int j=i+1;j<9;j++)
for(int k=j+1;k<9;k++)
for(int l=k+1;l<9;l++)
for(int m=l+1;m<9;m++)
for(int n=m+1;n<9;n++)
for(int o=n+1;o<9;o++)
aa[count++] = aa[i] + aa[j] + aa[k] +aa[l] + aa[m] +aa[n] + aa[o];
for(int i=0;i<9;i++)
for(int j=i+1;j<9;j++)
for(int k=j+1;k<9;k++)
for(int l=k+1;l<9;l++)
for(int m=l+1;m<9;m++)
for(int n=m+1;n<9;n++)
for(int o=n+1;o<9;o++)
for(int p=o+1;p<9;p++)
aa[count++] = aa[i] + aa[j] + aa[k] + aa[l] + aa[m]+aa[n]+aa[o]+aa[p];
aa[count] = 409113;
// for(int i=0;i<count+1;i++)
// {
// printf("%d\n",aa[i]);
// }
// system("pause");
int t = count+1;
for(int i=0;i<t;i++)
{
aa[count++] = aa[i] + 1;
}
aa[count++] = 409114;
//以上存储部分完成
// for(int i=0;i<count;i++)
// {
// printf("%d\n",aa[i]);
// }
// system("pause");
while(1)
{
int temp;
int flag = 0;
scanf("%d",&temp);
if(temp==-1)
{
return 0;
}
else
{
if(temp==0)
{
printf("NO\n");
continue;
}
for(int i=0;i<count+5;i++)
{
if(aa[i]==temp)
{
flag = 1;
break;
}
}
if(flag == 1)
{
printf("YES\n");
}
if(flag==0)
{
printf("NO\n");
}
}
}
// printf("count = %d\n",count);
// for(int i=0;i<count;i++)
// {
// printf("%lld\n",aa[i]);
// }
//system("pause");
return 0;
}