思路
10的6次方小于10的阶乘,因此给的n值一定是由1~9之间的某些数字的阶乘求和而来,因此我们枚举把每各个位的阶乘组合起来放到我们的哈希表中,最后输入一个数字,如果这个数字在哈希表中,那就是可以组成,否则就是不能组成。
C++ 代码
#include<iostream>
#include<unordered_set>//转化成set表
using namespace std;
int f[10];
unordered_set<int> p;
int n;
int main()
{
//开始先把每个数字的阶乘求出来
for (int i = 0; i < 10; i++)
{
f[i] = 1;
for (int j = i; j; j--)
{
f[i] *= j;
}
}
//再将1~9之间的每个数的阶乘的所有情况都存入到哈希表中
for (int i = 1; i < 1 << 10; i++)//在这里1<<10表示2^10=1024
{
int s = 0;
for (int j = 0; j < 10; j++)//将i进行右移 j位操作
{
if (i >> j & 1)
{
s += f[j];
}
}
p.insert(s);//将s输入到p中
}
//接下来进行输入
while (cin >> n && n >= 0)
{
if (p.count(n))
{
puts("YES");
}
else
{
puts("NO");
}
}
return 0;
}