赞
踩
题目要求:
在0~10000内打印出所有的水仙花数.
名词解释:
水仙花数(Narcissistic number)也被称为超完全数字不变数(pluperfect digital invariant, PPDI)、自恋数、自幂数、阿姆斯壮数或阿姆斯特朗数(Armstrong number)。一个n位数 , 它的每个数位上的数字的 n次幂之和等于它本身。例如:1^3 + 5^3+ 3^3 = 153。
水仙花数只是自幂数的一种,严格来说3位数的3次幂数才称为水仙花数。
附:其他位数的自幂数名字
一位自幂数:独身数
三位自幂数:水仙花数
四位自幂数:四叶玫瑰数
五位自幂数:五角星数
六位自幂数:六合数
七位自幂数:北斗七星数
八位自幂数:八仙数
九位自幂数:九九重阳数
十位自幂数:十全十美数
解题思路:
首先遍历取值范围内的每一个数, 利用一个for循环语句. 每遍历到一个数时, 首先确定这个数是几位数, 这意味着这个数要求多少次方. 得知这个数是n位数后, 利用pow函数求这个数每一位的n次方, 累加起来存放在变量sum里. 最后判断sum是否与这个数本身相等 , 如果相等则说明这个数为题目要求的超完全数字不变数.
代码实现:
(实现的代码本身不复杂不多, 是由于我想要打印文字提示, 所有才看着代码有点多的, 如果想要简化代码方便阅读理解可以将该提示文字即switch函数删掉)
- #include<stdio.h>
- #include<math.h>
-
- void main()
- {
- int i = 0, p1, p3, p4, p5, p6, p7, p8, p9, p10;
- p1 = p3 = p4 = p5 = p6 = p7 = p8 = p9 = p10 = 0; //变量p1~p10仅是为了打印文字提示
- for (; i < 10000; i++)
- {
- //1.确定为几位数
- int buf = i, n = 1;
- while (buf/10)
- {
- n++;
- buf /= 10;
- }
- //2.计算数字的每一个位的n次方
- int sum = 0, times = n;
- buf = i;
- while (times--)
- {
- sum += pow(buf%10, n); //pow是用来求buf%10的n次方的函数
- buf /= 10;
- }
- //该switch语句只是为了打印出字符提示词, 不需要的话可以省略
- switch (n)
- {
- case 1:
- if (p1 == 0)
- {
- printf("在该范围内独身数有:");
- p1 = 1;
- }
- break;
- case 3:
- if (p3 == 0)
- {
- printf("\n在该范围内水仙花数有:");
- p3 = 1;
- }
- break;
- case 4:
- if (p4 == 0)
- {
- printf("\n在该范围内四叶玫瑰数有:");
- p4 = 1;
- }
- break;
- case 5:
- if (p5 == 0)
- {
- printf("\n在该范围内五角星数有:");
- p5 = 1;
- }
- break;
- case 6:
- if (p6 == 0)
- {
- printf("\n在该范围内六合数有:");
- p6 = 1;
- }
- break;
- case 7:
- if (p7 == 0)
- {
- printf("\n在该范围内北斗七星数有:");
- p7 = 1;
- }
- break;
- case 8:
- if (p8 == 0)
- {
- printf("\n在该范围内八仙数有:");
- p8 = 1;
- }
- break;
- case 9:
- if (p9 == 0)
- {
- printf("\n在该范围内九九重阳数有:");
- p9 = 1;
- }
- break;
- case 10:
- if (p10 == 0)
- {
- printf("\n在该范围内十全十美数有:");
- p10 = 1;
- }
- break;
- }
- //3.判断
- if (sum == i)
- {
- printf("%d ",i);
- }
-
- }
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。