水仙花数与兰德尔数

来源:互联网 发布:中南大学大数据专业 编辑:程序博客网 时间:2024/06/11 23:57

兰德尔数(Randle)数又称 自方幂数 ,是一类涉及自身特点的一类整数;

最简单的兰德尔数:三位称水仙花数,四位称玫瑰花数,五位称五角星数,六位称六合数 等……

从搜索水仙花数开始,进而探索一般n位兰德尔数;

水仙花数

一个三位数如果等于它的三个数字的立方和,该三位数称为水仙花数

探求所有的水仙花数;

1.说明:

在处理整数的程序运行中,常用 组合分解 这两种基本方式来设计求解;

2.程序设计:

  • 基于 分解 的程序设计;

设置 m(100~999)循环枚举所有的三位数,把 m 分解出三个数字a、b、c,然后检验 m 是否等于a、b、c的立方和;
如果相等,则打印输出;

#include<stdio.h>int main(){   int m,a,b,c;   for(m=100;m<=999;m++)   {      a=m/100;     /*把m分解为三个数字*/      b=(m/10)%10;      c=m%10;      if(m==a*a*a+b*b*b+c*c*c)/*检验是否满足条件*/         printf("  %d",m);   }}
  • 基于 组合 的程序设计;

设置a(1~9)、b(0~9)、c(0~9)三重循环对应枚举 百位、十位、个位 三个数字,由a,b,c组合为三位数 m 后检验 m 是否等于a、b、c的立方和;

#include<stdio.h>int main(){   int m,a,b,c;   for(a=1;a<=9;a++)      for(b=0;b<=9;b++)         for(c=0;c<=9;c++)         {            m=a*100+b*10+c;            if(m==a*a*a+b*b*b+c*c*c)/*检验是否满足条件*/               printf("  %d",m);         }}

3.程序运行示例及其注意事项:

  153  370  371  407

注意:

  • 前者基于分解,把三位数 m 分解为三个数字a、b、c;
  • 后者基于组合,把三个数字a、b、c组合为三位数 m ;

n位兰德尔数

兰德尔数: 一个n(n>=3)位正整数如果等于它的n个数字的n次幂之和,该数称为n位兰德尔(Randle)数,又称为自幂方数

试探索指定的n(3<=n<=9)位兰德尔数;

1.说明:

  • 循环枚举 n位整数y,循环分离 其n个数字k;
  • 为求n位数y的n个数字k的n次幂方数,相关n位数t,y,f及k均设置为double型,这样数字k的n次幂即为 pow(k,n)
  • s+=pow(k,n)即为y的n个数字的n次幂之和;重点内容
  • 检测y=s即可打印输出n位兰德尔数;

2.程序设计:

  • 基于 分解 的程序设计;

1)、pow() 函数:

头文件:#include < math.h >
其原型为:double pow(double x, double y)
作用:pow()用来计算以x 为底的 y 次方值,然后将结果返回。设返回值为 ret,则 ret = x^y

2)、fmod函数:

头文件:#include < math.h >
其原型为:double fmod (double x,double y)
作用:设返回值为 ret,那么 ret= x-n * y,其中 n 是整数,ret 和 x 有相同的符号,而且 ret 的绝对值小于 y 的绝对值

3)、floor函数:

头文件:#include < math.h >
其原型为:double floor( double x )
作用:函数返回参数不大于x的最大整数“向下取整”或者说“向下舍入”

#include<stdio.h>#include<math.h>int main(){   int m,n,i;   double f,k,s,t,y;   printf("请输入位数n(2<n<10):");   scanf("%d",&n);   m=0;   t=1;   for(i=1;i<=n-1;i++)      t=t*10;   for(y=t+1;y<=t*10-1;y++)   /*枚举n位整数*/   {      f=y;      for(s=0,i=1;i<=n;i++)  /*循环分离y的n个数字k*/      {         k=fmod(f,10);         s+=pow(k,n);         f=floor(f/10);      }      if(y==s)    /*检验是否满足条件*/      {         m++;         printf("  %.0f",y);      }   }   printf("\n%d位的兰德尔数共%d个。\n",n,m);}

3.程序运行示例及其注意事项:

请输入位数n(2<n<10):7  1741725  4210818  9800817  99263157位的兰德尔数共4个。

注意:程序枚举时间复杂度O(10^n),当n>7时运行搜索时间会比较长。

1 0