兰德尔数(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 9926315
7位的兰德尔数共4个。
注意:程序枚举时间复杂度O(10^n),当n>7时运行搜索时间会比较长。