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;
}