本篇主要分析了水仙花数的各种求法。“水仙花数”也叫做“阿姆斯特朗数”,是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个水仙花数,以为153=1³+5³+3³.
一、水仙花数的由来
1、为什么叫水仙花数
经过上面的介绍,都知道了“水仙花数”是指一个三位数,其各位数字立方和等于该数本身。那么为什么会叫“水仙花数”呢?这么好听的名字……
原来,她的兄弟姐妹的名字也个个都好听>>>>>>
三位自幂数:水仙花数
四位自幂数:四叶玫瑰数
五位自幂数:五角星数
六位自幂数:六合数
七位自幂数:北斗七星数
八位自幂数:八仙数
九位自幂数:九九重阳数
十位自幂数:十全十美数
看到这个十全十美数就真的懂了,“水仙花数”果然没叫错。
2、水仙花数的家族
三位的水仙花数共有4个:153,370,371,407;
四位的四叶玫瑰数共有3个:1634,8208,9474;
五位的五角星数共有3个:54748,92727,93084;
六位的六合数只有1个:548834;
七位的北斗七星数共有4个:1741725,4210818,9800817,9926315;
八位的八仙数共有3个:24678050,24678051,88593477
二、基础版水仙花数
1、分析:
(1)因为“水仙花数”是一个三位数,因此可以用3个变量a,b,c来分别表示百位数、十位数、个位数;
(2)准备3个循环来遍历,因为百位数不能是0,所以a从1到9循环;
(3)而十位数和个位数可以是0,所以b、c从0循环到9
2、参考代码:
#include <stdio.h>
#include <math.h>
main()
{
int a, b, c;
printf("水仙花数有:\n");
for(a=1;a<=9;a++)
{
for(b=0;b<=9;b++)
{
for(c=0;c<=9;c++)
{
if(pow(a,3) + pow(b,3) + pow(c,3) == a*100+b*10+c)
//pow(a,3)为a的3次方 ; a*100+b*10+c表示遍历到的那个数
{
printf("%5d",a*100+b*10+c);
}
}
}
}
}
三、进阶版水仙花数
1、分析:
(1)利用for循环从100循环到999,对每一个数分解出个位、十位、百位;
(2)然后计算各位数字的立方和,判断立方和是否与该数相等;如果相等就输出该数,即为该“水仙花数”
2、参考代码:
#include <stdio.h>
#include <math.h> //导入数学库,便于次方运算
main()
{
int a, b, c, n; //a,b,c分别为百位、十位、个位上的数;n作为遍历对象
printf("水仙花数有:\n");
for(n=100;n<1000;n++)
{
a= n/100; //取百位上的数赋值给a,多余的数会直接舍去
b= (n-a*100)/10; //取十位上的数,减去百位上的数后除10就是取十位上的数
c= n - a*100 - b*10; //减去百位和十位,就只剩下个位上的数了
if(pow(a,3) + pow(b,3) + pow(c,3) == n) //pow(a,3)为a的3次方
{
printf("%5d",n);
}
}
}
四、高级版水仙花数
1、万能的分离数的各位:
(1)下面这个程序可以将任意一个整数的每一位数都分离出来
(2)参考代码:
//万能分离每一位数
#include <stdio.h>
main()
{
int n, a;
printf("请输入一个整数:");
scanf("%d",&n);
printf("\n%d的每一位数分别是:",n);
while(n!=0)
{
a= n%10;
n= n/10;
printf("%3d",a);
}
}
(3)参考结果:
2、把该方法用到求“水仙花数”上:
#include <stdio.h>
#include <math.h> //导入数学库,便于次方运算
main()
{
int a, b, c, n; //a,b,c分别为百位、十位、个位上的数;n作为遍历对象
printf("水仙花数有:\n");
for(n=100;n<1000;n++)
{
a= n/10/10%10; //得到百位,比如234/10/10=2;再2%10=2
b= n/10%10; //得到十位
c= n%10; //得到个位
if(pow(a,3) + pow(b,3) + pow(c,3) == n) //pow(a,3)为a的3次方
{
printf("%5d",n);
}
}
}
3、参考结果: