论坛交流
首页办公自动化| 网页制作| 平面设计| 动画制作| 数据库开发| 程序设计| 全部视频教程
应用视频: Windows | Word2007 | Excel2007 | PowerPoint2007 | Dreamweaver 8 | Fireworks 8 | Flash 8 | Photoshop cs | CorelDraw 12
编程视频: C语言视频教程 | HTML | Div+Css布局 | Javascript | Access数据库 | Asp | Sql Server数据库Asp.net  | Flash AS
当前位置 > 文字教程 > C语言程序设计教程
Tag:新手,函数,指针,数据类型,对象,Turbo,入门,运算符,数组,结构,二级,,tc,游戏,试题,问答,编译,视频教程

C趣味程序(二)(04)

文章类别:C语言程序设计 | 发表日期:2008-9-24 14:44:34

1.5.1 求三位阶乘和数
1.5.2 求所有阶乘和数



1.5 阶乘和数
    一个正整数假如等于组成它的各位数字的阶乘之和,该整数称为阶乘和数。
    例如,145=1!+4!+5!,则145是一个三位阶具体和数。是否还有其它三位阶乘和数?共有多少个阶乘和数?

1.5.1 求三位阶乘和数
    试求出所有三位阶乘和数:m=abc=a!+b!+c!(其中a为百位数字,b为十位数字,c为个位数字。约定0!=1)。
算法分析如下:
    通过循环累乘设计一个求阶乘的函数:jc(x)=x!
    对任意一个三位数m,分解其百位数字a,十位数字b,个位数字c。条件差判别:若m等于jc(a)+jc(b)+jc(c),则作打印输出。也可通过a,b,c三重循环组合为三位数m=a*100+b*10+c,然后作条件判别。
#include<stdio.h>
long jc(int x);
void main()
{
    int a,b,c,m,n;
    printf("三位阶乘和数有:");
    for(a=1;a<=9;a++)            /*a,b,c分别为三位数的百位、十位、个位数字*/
        for(b=0;b<=9;b++)
            for(c=0;c<=9;c++)
            {
                m=a*100+b*10+c;
                n=jc(a)+jc(b)+jc(c);    /*阶乘和条件判别*/
                if(m==n) printf("%d\n",m);
            }
}
long jc(int x)
{
    int i;
    long p=1;
    for(i=1;i<=x;i++) 
        p*=i;
    return p;
}
程序运行结果:
三位阶乘和数有:145

注:可见三位阶乘和数只有一个 145

---------------------------------------------------

1.5.2 求所有阶乘和数
算法分析如下:
    设阶乘和数的位数为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<stdio.h>
long jc(int x);
void 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);      /*1位数a满足条件则输出*/
      for(b=0;b<=9;b++)
      {
         m1=a*10+b;
         n1=jc(a)+jc(b);
         if(m1==n1) printf("%ld ",m1);   /*判别2位数m1*/
         for(c=0;c<=9;c++)
         {
            m2=m1*10+c;
            n2=n1+jc(c);
            if(m2==n2) printf("%ld ",m2);   /*判别3位数m2*/
            for(d=0;d<=9;d++)
            {
               m3=m2*10+d;
               n3=n2+jc(d);
               if(m3==n3) printf("%ld ",m3);   /*判别4位数m3*/
               for(e=0;e<=9;e++)
               {
                  m4=m3*10+e;
                  n4=n3+jc(e);
                  if(m4==n4) printf("%ld ",m4);   /*判别5位数m4*/
                  for(f=0;f<=9;f++)
                  {
                     m5=m4*10+f;
                     n5=n4+jc(f);
                     if(m5==n5) printf("%ld ",m5);   /*判别6位数m5*/
                     for(g=0;g<=9;g++)
                     {
                        m6=m5*10+g;
                        n6=n5+jc(g);
                        if(m6==n6) printf("%ld ",m6);   /*判别位数m6*/
               }}}}}}}
}
long jc(int x)
{
    int i;
    long p=1;
    for(i=1;i<=x;i++)  p*=i;
    return p;
}


程序运行结果为:
所有阶乘和数有: 1   145   2   40585

可见阶乘和数一共只有4个,其中1,2是显而易见的。

上一篇:{实例}C趣味程序(二)(03) 人气:6149
下一篇:{实例}C趣味程序(二)(05) 人气:6171
视频教程列表
文章教程搜索
 
C语言程序设计推荐教程
C语言程序设计热门教程
看全部视频教程
购买方式/价格
购买视频教程: 咨询客服
tel:15972130058