打印0~100000的水仙花数(简单易懂方法)

1.介绍水仙花数

    水仙花数(Narcissistic number),也被称为超完全数字不变数、自恋数、自幂数、阿姆斯壮数或者阿姆斯特朗数,水仙花数是指一个3位数,它的每个位数上的数字的3次幂之和等于它本身,例如153是一个水仙花数,因为1^3+5^3+3^3=153,所以是一个水仙花数。

    而我们现在的题目是:要打印0~100000的”水仙花数“,实际上是一个自幂数,其含义也是跟水仙花数的定义差不多,就是指一个n位数,每个位数上的数字的次幂之和等于它本身,差不多就这个意思。



2.必备知识

    /1.我们知道了水仙花数的定义之后,现在要打印水仙花数,所以我们需要各个位数的数字该如何表示:

    例如:我们要知道123的各个位数的数字‘1’,‘2’,‘3’该如何表示,我们可以先让这个数除以一个100,除以上了100之后,由于我们没有带上小数点,所以只会得到整数部分,也就是‘1’,接着我们该如何打印2=‘2’呢?我们可以先把123%100,这样就得到了它的余数23,再让23除以一个10,不就得到了它的‘2’了吗,以此类推,我们就可以得到它的各个位数。

    /2.我们还需要了解一个知识,就是如何解决幂次问题,也就是利用pow来解决,这里我们在利用数学运算的时候,要包含一个头文件:math.h,我们用pow的时候,假设要求3的平方,就写pow(3.0,2.0),逗号前面的数字是要幂的数字,逗号后面的数字是幂的次数。



3.逐步分析

    了解到了这些,我们就可以开始我们的代码:

    /1.首先,我们需要进行一个for循环,来打印0~100000的数字,在这里我们可以简单一点,为了避免使用过多位数,所以我们可以小判断一下100000肯定不是水仙花数,然后我们只需用0~99999的数字就行了,所以我们只需要用5个字母代替5个位数(这里博主偷了个小小的懒,其实为了严谨也可以用6个位数来,思路都是一样的,我这里主要讲的是思路),然后我们分别用a,b,c,d,e来表示1~5位数,所以我们先定义并打印0~99999的数字:

    /2.接下来,我们就要表示5个位数,按照我上面的讲解,思路都是一样的,所以我们可以这样表示:

    /3.接下来就是一个一个判断,1~5位数是不是水仙花数,比如1位数,因为就是本身的1次幂,所以肯定是水仙花数,然后2位数就2次幂和,5位数就5次幂和,一个一个判断,思路都是一样的,所以我们可以这么写:

    /4.这样我们就写完了全部的代码,然后打印出来就是这样:



4.代码展示

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include<math.h>
int main()
{
	int num, a, b, c, d, e;
	for (num = 0; num <= 99999; num++)
	{
		a = num / 10000;
		b = (num % 10000) / 1000;
		c = ((num % 10000) % 1000) / 100;
		d = (((num % 10000) % 1000) % 100) / 10;
		e = (((num % 10000) % 1000) % 100) % 10;
		if (num >= 0 && num <= 9)
		{
			printf("%d ", num);
		}
		else if (num >= 10 && num <= 99)
		{
			if (num == pow(d, 2.0) + pow(e, 2.0))
			{
				printf("%d ", num);
			}
		}
		else if (num >= 100 && num <= 999)
		{
			if (num == pow(c, 3.0) + pow(d, 3.0) + pow(e, 3.0))
			{
				printf("%d ", num);
			}
		}
		else if (num >= 1000 && num <= 9999)
		{
			if (num == pow(b, 4.0) + pow(c, 4.0) + pow(d, 4.0) + pow(e, 4.0))
			{
				printf("%d ", num);
			}
		}
		else
		{
			if (num == pow(a, 5.0) + pow(b, 5.0) + pow(c, 5.0) + pow(d, 5.0) + pow(e, 5.0))
			{
				printf("%d ", num);
			}
		}
	}
	return 0;
}

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

七分七分_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值