阶乘和数

本文探讨了阶乘和数的概念,即一个正整数等于其各位数字的阶乘之和。文章首先介绍了如何寻找三位的阶乘和数,并通过两种方案进行了解析,接着分析了阶乘和数的最大位数不超过7位,并列举了所有可能的阶乘和数,包括145和40585等。
部署运行你感兴趣的模型镜像

一个正整数如果等于组成它的各位数字的阶乘之和,该正整数称为阶乘和数

1.说明:
试求三位阶乘和数,进而求出所有的阶乘和数。

2.程序设计:
(1).求三位阶乘和数:abc=a!+b!+c!,其中a为百位数字hundred(a!=0),b为十位数字ten,c为个位数字one。约定0!=1
由于7!=5040>999的,因此a、b、c都必定小于7.

方案一:

#include<stdio.h>
long jc(int n);    /*自定义函数说明*/
void main()
{
  int hundred,ten,one,m,n;   
  printf("三位阶乘和数有:");
  for(hundred=1;hundred<=6;hundred++)
  for(ten=0;ten<=6;ten++)
  for(one=0;one<=6;one++)
  {
    m=hundred*100+ten*10+one;
    n=jc(hundred)+jc(ten)+jc(one);
    if(m==n)   /*阶乘和条件判别*/
      printf("%d\n",n);
  }
  getch();
}
long jc(int n)
{
  int i;
  long s=1;
  for(i=1;i<=n;i++)
    s*=i;
  return(s);
}

方案二:

#include<stdio.h>
long jc(int n);
void main()
{
  int hundred,ten,one,i,n;
  printf("三位阶乘和数有:");
  for(i=100;i<=999;i++)
  {
    hundred=i/100;
    ten=i%100/10;
    one=i%100%10;
    n=jc(hundred)+jc(ten)+jc(one);
    if(n==i)
      printf("%d\n",n);
  }
  getch();
}
long jc(int n)
{
  int j;
  long s=1;
  for(j=1;j<=n;j++)
    s*=j;
  return(s);
}

(2).求所有阶乘和数:设阶乘和数的位数为n,这里的n可以为1,2,…,容易证明:n<8
事实上,若阶乘和数达到8位(或者更大),阶乘和最大(即设定每位数字都为9)也要比最小的8位数小,即:8 * 9!=8 * 362880<10000000
由此可见,阶乘和数最多只可能为7位。
设置a、b、c、d、e、f、g共7重循环,在所有的1~7位数中搜索,寻找满足阶乘和条件的数。

方案一:

#include<stdio.h>
long jc(int n);
void main()
{
  int a,b,c,d,e,f,g;
  long int 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(b)+jc(a);
      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==n2)
            printf("%ld",m3);    /*四位数满足条件则输出*/
          for(e=0;e<=9;e++)
          {
            m4=m3*10+e;
            n4=n3+jc(e);
            if(m4==n3)
              printf("%ld",m4);    /*五位数满足条件则输出*/
            for(f=0;f<=9;f++)
            {
              m5=m4*10+f;
              n5=n4+jc(f);
              if(m5==m4)
                printf("%ld",m5);    /*六位数满足条件则输出*/
              for(g=0;g<=9;g++)
              {
                m6=m5*10+g;
                n6=n5+jc(g);
                if(m6==n6)
                  printf("%ld",m6);    /*七位数满足条件则输出*/
              }
            }
          }
        }
      }
    }
   }
   getch();
 }
 long jc(int n)
 {
   int i;
   long s=1;
   for(i=1;i<=n;i++)
     s*=i;
   return s;
 }

3.程序运行示例及其注意事项:
(1)中的方案一、二: 三位阶乘和数有:145
(2)中的方案: 所有的阶乘和数有:1 145 2 40585

注意:在求所有阶乘和数时不可用(1)中类似方案二的方法,因为方案二使用的前提就是数字位数已定,且最高位不为零。

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值