原:http://ncc.neuq.edu.cn/oj/problem.php?id=1175
题目描述
一个正整数如果等于组成它的各位数字的阶乘之和,该整数称为阶乘和数。
例如,145=1!+4!+5!,则145是一个三位阶详细和数。
请问:共有多少个阶乘和数?
输入
输出
所有的阶乘和数(按字典序,即1打头的在前,2打头的次之,..., 空格分隔)
样例输入
样例输出
1 145 2 ......
提示
提示:8*9!=8*362880<10000000
算法分析如下:
设阶乘和数的位数为n,n可以为1,2... 容易证明:n<8
事实上,若阶乘和数达到8位(或更大),阶乘和最大(即设定每位数字都为9)也要比最小的8位数小,即:
8X9!=8*362880<10000000
由此可见,阶乘和数最多只能为7位
设置a,b,c,d,e,f,g共7重循环,在所有1~7位整数中搜索,寻找满足阶乘和条件的数,这样可找出所有阶乘和数。
代码:
#include
long
jc(int x);
int
main()
{
int a,b,c,d,e,f,g;
long
m1,m2,m3,m4,m5,m6,n1,n2,n3,n4,n5,n6;
printf("所有阶乘和数有:
");
for(a=1;a<=9;a++)
{
if(a==jc(a)) printf("%d ",a);
for(b=0;b<=9;b++)
{
m1=a*10+b;
n1=jc(a)+jc(b);
if(m1==n1) printf("%ld ",m1);
for(c=0;c<=9;c++)
{
m2=m1*10+c;
n2=n1+jc(c);
if(m2==n2) printf("%ld ",m2);
for(d=0;d<=9;d++)
{
m3=m2*10+d;
n3=n2+jc(d);
if(m3==n3) printf("%ld ",m3);
for(e=0;e<=9;e++)
{
m4=m3*10+e;
n4=n3+jc(e);
if(m4==n4) printf("%ld ",m4);
for(f=0;f<=9;f++)
{
m5=m4*10+f;
n5=n4+jc(f);
if(m5==n5) printf("%ld ",m5);
for(g=0;g<=9;g++)
{
m6=m5*10+g;
n6=n5+jc(g);
if(m6==n6) printf("%ld ",m6);
}}}}}}}
}
long
jc(int x)
{
int i;
long p=1;
for(i=1;i<=x;i++)
p*=i;
return p;
}
代码:
#include
using
namespace std;
int
jiec(int a)
{
int i,s=1;
for(i=1;i<=a;i++) s=s*i;
return s;
}
int
main()
{
int a,b,c,d,e,f,g;
for(a=1;a<10;a++)
{
if(a==jiec(a)) cout<<a<<" ";
for(b=0;b<10;b++)
{
int b1=a*10+b;
if(b1==jiec(a)+jiec(b))
cout<<b1<<" ";
for(c=0;c<10;c++)
{
int c1=a*100+b*10+c;
if(c1==jiec(a)+jiec(b)+jiec(c))
cout<<c1<<" ";
for(d=0;d<10;d++)
{
int
d1=a*1000+b*100+c*10+d;
if(d1==jiec(a)+jiec(b)+jiec(c)+jiec(d)) cout<<d1<<"
";
for(e=0;e<10;e++)
{
int
e1=a*10000+b*1000+c*100+d*10+e;
if(e1==jiec(a)+jiec(b)+jiec(c)+jiec(d)+jiec(e))
cout<<e1<<" ";
for(f=0;f<10;f++)
{
int
f1=a*100000+b*10000+c*1000+d*100+e*10+f;
if(f1==jiec(a)+jiec(b)+jiec(c)+jiec(d)+jiec(e)+jiec(f))
cout<<f1<<" ";
for(g=0;g<10;g++)
{
int
g1=a*1000000+b*100000+c*10000+d*1000+e*100+f*10+g;
if(g1==jiec(a)+jiec(b)+jiec(c)+jiec(d)+jiec(e)+jiec(f)+jiec(g))
cout<<g1<<" ";
}
}
}
}
}
}
}
return 0;
}
加载中,请稍候......