加载中…
个人资料
小怪兽它爹爹叫大怪兽
小怪兽它爹爹叫大怪兽
  • 博客等级:
  • 博客积分:0
  • 博客访问:230
  • 关注人气:2
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

阶乘和数

(2014-08-19 18:56:33)
标签:

it

分类: oj题解

原: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;
}

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有