【C语言】第五十一题→求出0~100000之间所有的"水仙花数"并输出。

591 阅读5分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 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

✨最后✨

这道题目相较于前面的题目是挺难的,对于初学者来说毕竟是一道算法题,希望大家能做√╰(*°▽°*)╯