题目描述
一个正整数如果等于组成它的各位数字的阶乘之和,该整数称为阶乘和数。
例如,145=1!+4!+5!,则145是一个三位阶乘和数。
请问:共有多少个阶乘和数?(不会超过十万)
输入
无
输出
所有的阶乘和数(按字典序,即1打头的在前,2打头的次之,…, 空格分隔)
样例输入
无
样例输出
1 145 2 40585
//暴力法
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
long f(long n){//求n的阶乘
long sum = 1;
for(int i = 1; i <= n; i++){
sum *= i;
}
return sum;
}
int main(){
int x = 0;
long a[10];//a数组用存符合条件的数
for(long i = 1; i < 100000; i++){//从1到100000遍历
long j = i;
long b[10];//b数组用于存每个i各个位被分解的数
int c = 0;//用于记录被分解数的长度
while(j){
b[c++] = j%10;
j /= 10;
}
long s = 0;//s用于存各个位的阶乘
for(int k = 0; k < c; k++){//求各个位数的阶乘和
s += f(b[k]);
}
if(s == i){//判断各个位的阶乘是否和i相等
a[x++] = i;
}
}
for(int i = 0; i < x; i++){//字典序
for(int j = i + 1; j < x; j++){
int s1 = a[i],s2 = a[j];//s1是前一个数,s2是后一个数
int x1,x2;//x1是前一个数的个位,x2是后一个数的个位
while(s1){//取前一个数的个位
x1 = s1 % 10;
s1 /= 10;
}
while(s2){//取后一个数的个位
x2 = s2 %10;
s2 /= 10;
}
if(x1 > x2){//判断前一个数的个位字典序是否大于后一个,大的话就交换两个的值
long temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
}
for(int i = 0; i < x; i++){//输出
printf("%ld ",a[i]);
}
return 0;
}