题目描述
一个正整数如果等于组成它的各位数字的阶乘之和,该整数称为阶乘和数。
例如,145=1!+4!+5!,则145是一个三位阶乘和数。
请问:共有多少个阶乘和数?(不会超过十万)
输入
无
输出
所有的阶乘和数(按字典序,即1打头的在前,2打头的次之,…, 空格分隔)
思路
- 这个题就是要遍历1到100000,将每个数每一位的阶乘之和算出来,难点在于算阶乘和以及按打头的数字排序。
- 阶乘计算单独写成函数
- 写一个循环遍历1到9,然后再设置数量级不断增大,即可实现按打头的数字排序
代码
#include<stdio.h>
#include<math.h>
int factorial(int n);
int main()
{
int i, j, k, n, sum, num;
for(i = 1; i <= 9; i++) //1到9开头的数字
{
for(j = 0; j < 5; j++)
{
n = i * pow(10, j); //数量级为1,10,100,1000,10000,100000
for(k = n; k < (n + pow(10, j)); k++)
{
sum = 0;
num = k;
while(num > 0)
{
sum += factorial(num % 10);
num /= 10;
}
if(sum == k)
{
printf("%d ", k);
}
}
}
}
return 0;
}
int factorial(int n)
{
if(n == 0 || n == 1)
return 1;
else if(n >= 2)
return n * factorial(n - 1);
}