C++打印100到100000的“水仙花数”(含详细思路)

要求水仙花数,得先知道水仙花数的定义~

水仙花数是指一个 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个水仙花数!

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值