携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第2天,点击查看活动详情
前言
今天开始刷C语言的第五十一题,已经过半了,加油坚持就是胜利,胜利就在前方🔥
题目描述
求出0~100000之间所有的"水仙花数"并输出。
水仙花数简介
水仙花数(Narcissistic number)也被称为超完全数字不变数(pluperfect digital invariant, PPDI)、自恋数、自幂数、阿姆斯壮数或阿姆斯特朗数(Armstrong number),水仙花数是指一个 3 位数,它的每个位上的数字的 3次幂之和等于它本身。例如:1^3 + 5^3+ 3^3 = 153。
水仙花数只是自幂数的一种,严格来说3位数的3次幂数才称为水仙花数。
附:其他位数的自幂数名字
一位自幂数:独身数
三位自幂数:水仙花数
四位自幂数:四叶玫瑰树
五位自幂数:五角星数
六位自幂数:六合数
七位自幂数:北斗七星数
八位自幂数:八仙数
九位自幂数:九九重阳数
十位自幂数:十全十美数
常见水仙花数
水仙花数又称之为阿姆斯特朗数。
三位的水仙花数共有4个:153,370,371,407;
四位的四叶玫瑰数共有3个:1634,8208,9474;
五位的五角星数共有3个:54748,92727,93084;
六位的六合数只有1个:548834;
七位的北斗七星数共有4个:1741725,4210818,9800817,9926315;
八位的八仙数共有3个:24678050,24678051,88593477;
九位的九九重阳数共有4个: 146511208,472335975,534494836,912985153;
十位的自幂数只有1个:4679307774
使用高精度计算,可以得到超过int类型上限的水仙花数:
5: 93084
5: 92727
5: 54748
6: 548834
7: 9800817
7: 4210818
7: 1741725
7: 9926315
8: 24678050
8: 24678051
8: 88593477
9: 146511208
9: 472335975
9: 534494836
9: 912985153
10: 4679307774
11: 32164049650
11: 40028394225
11: 42678290603
11: 49388550606
11: 32164049651
11: 94204591914
11: 44708635679
11: 82693916578
14: 28116440335967
16: 4338281769391370
16: 4338281769391371
17: 21897142587612075
17: 35641594208964132
17: 35875699062250035
19: 1517841543307505039
19: 3289582984443187032
19: 4929273885928088826
19: 4498128791164624869
20: 63105425988599693916
21: 449177399146038697307
21: 128468643043731391252
23: 27907865009977052567814
23: 35452590104031691935943
23: 27879694893054074471405
23: 21887696841122916288858
24: 174088005938065293023722
24: 188451485447897896036875
(为环保起见,24位以上的水仙花数略)
最大的水仙花数有39位。十进制自然数中的所有水仙花数共有88个。
题目分析
说明:"水仙花数"是指一个n位数,其中各位数字的n次方之和确好等于该数字本身。
如:153 = 1 ^ 3 + 5 ^ 3 + 3 ^ 3 = 1 + 125 + 27 = 153,则153是一个"水仙花数" 。
像个位数0~9本身就是个位n次方之和就一定是水仙花数。因为1乘以任何个位数都等于它本身。
这道题目相较于还是稍微有点难度的也是一道基础的算法题。
做这道题目的时候我们可以使用循环来解决,然后再来进行计算,最后判断求出水仙花数。
题目代码
#define _CRT_SECURE_NO_WARNINGS 1
#define Number 100000
#include<stdio.h>
#include<math.h>
int main(void)
{
int i = 0;
for (i = 0; i <= Number; i++)
{
//计算 i 的位数 (n)
int n = 1;
int tmp = i;//注意:要把 i 的值赋值给 tmp
while (tmp / 10)
{
n++;
tmp = tmp / 10;
}
//计算i每一位n次方之和
tmp = i;
int sum = 0;
while (tmp)
{
sum += (int)pow(tmp % 10, n);//pow()-求次方
tmp = tmp / 10;
}
//判断
if (sum == i)
{
printf("%d\n", i);
}
}
return 0;
}
运行结果
运行结果🖊
0
1
2
3
4
5
6
7
8
9
153
370
371
407
1634
8208
9474
54748
92727
93084
✨最后✨
这道题目相较于前面的题目是挺难的,对于初学者来说毕竟是一道算法题,希望大家能做√╰(*°▽°*)╯