要求水仙花数,得先知道水仙花数的定义~
水仙花数是指一个 3 位数,它的每个数位上的数字的 3次幂之和等于它本身 如:1^3 + 5^3+ 3^3 = 153
有的小伙伴就会问道:水仙花数既然是三位数,说明水仙花数只存在100~999之间,那博主为何求的是100~100000的水仙花数???
诶,我当然意识到这个问题啦,所以我标题上打的双引号嘛O(∩_∩)O
其实水仙花数是属于自幂数的一种,当然还有其他的自幂数:
一位自幂数:独身数
三位自幂数:水仙花数
四位自幂数:四叶玫瑰数
五位自幂数:五角星数
六位自幂数:六合数
七位自幂数:北斗七星数
八位自幂数:八仙数
九位自幂数:九九重阳数
十位自幂数:十全十美数
好哒,既然了解了“水仙花数”的概念,让我们回到正题:如何用代码求出水仙花数呢?
我们先大体地罗列一下思路:
一。先要遍历100到100000的数字
二。判断那些数字符合水仙花数的定义
三。将符合的数字记录并打印出来
第一步和第三步很简单,让我们对第二步细分一下,到底如何判断~
1.先判断这个数字是几位数
2.跟据这是几位数的数字,来遍历其最高位到个位的数字
3.求每个位上数字的幂次方和
4.判断其和是否和原数字相等,相等便是水仙花数,反之则不是
OK,了解了大体思路是不是就很简单了~
接下来我们一步一步分析:
//1.先判断这个数字是几位数
//假如现在这个数字现在是153,它是一个水仙花数
int a = 153;
int max = 0;//求数字a的最大位数
int num = 0;//记录数字的位数
for (int i = 1; i < 1000000000; i*10) //从1开始,一直循环乘以10
{
if (a < i) //判断153最大可以比10的多少倍数小,即153 < 1000
{
//所以当循环遍历3次后进入if语句中,这时i = 1000
max = i / 10; //max = 100
//利用while循环每次除以10求它的位数
while (i > 1)
{
i /= 10;
num++;
}
break; //循环三次后退出
}
i *= 10;
}
cout << "num = " << num << endl; //num = 3,即153是三位数
//2.跟据这是几位数的数字,来遍历其最高位到个位的数字
//3.求每个位上数字的幂次方和
//对于遍历最高位到个位的数字,由%和/运算可得如下关系:
int a = 153;
int max = 100;
cout << a / max % 10 << endl; //1
cout << a / (max / 10) % 10 << endl; //5
cout << a / (max / 100) % 10 << endl; //3
//所以我们可以用类似递归的方法层层嵌套来修改max的值
//并求出其幂次之和
int sum = 0;
for (int i = 0; i < num; i++) //注意这里的num并不死,是几位数,就乘几次幂
{
int j = a / max % 10;
sum += pow(j,num);
max /= 10;
}
cout << "sum = " << sum << endl; //sum = 153
//4.判断其和是否和原数字相等,相等便是水仙花数,反之则不是
//这个很简单
if (sum == a)
{
cout << a << "是水仙花数!" << endl;
}
else
{
cout << a << "不是水仙花数!" << endl;
}
然后对以上步骤进行整合,最终代码如下:
#include <iostream>
#include <math.h>
using namespace std;
void test01()
{
int n = 0; //记录水仙花个数
for (int i = 100; i < 100000; i++) //遍历100到100000
{
int num = 0; //判断i是几位数
int max = 0; //若i为5位数,则max = 10^5
for (int j = 1; j < 10000000; j * 10)
{
if (i < j)
{
max = j / 10;
while (j > 1)
{
j /= 10;
num++;
}
break;
}
j *= 10;
}
//计算各个位的幂次方和
int sum = 0;
for (int k = 0; k < num; k++)
{
int x = i / max % 10;
sum += pow(x, num);
max /= 10;
}
if (sum == i)
{
cout << i << "是水仙花数!" << endl;
n++;
}
}
cout << "一共有" << n << "个水仙花数!" << endl;
}
int main()
{
test01();
system("pause");
system("cls");
}
结果展示:
153是水仙花数!
370是水仙花数!
371是水仙花数!
407是水仙花数!
1634是水仙花数!
8208是水仙花数!
9474是水仙花数!
54748是水仙花数!
92727是水仙花数!
93084是水仙花数!
一共有10个水仙花数!