1. 水仙花数的描述
水仙花数(Narcissistic number)也被称作自恋数、自幂数等。它是指一个三位数,其各位数字的立方和等于该数本身。
例如,153是一个水仙花数,因为 1 3 + 5 3 + 3 3 = 1 + 125 + 27 = 153 1^3 + 5^3 + 3^3 = 1 + 125 + 27 = 153 13+53+33=1+125+27=153。
不过在本题要求的0 - 10000范围内,除了三位数的水仙花数,还可能有四位数符合类似规律(各位数字的四次方和等于该数本身),例如1634,因为 1 4 + 6 4 + 3 4 + 4 4 = 1 + 1296 + 81 + 256 = 1634 1^4 + 6^4 + 3^4 + 4^4 = 1 + 1296 + 81 + 256 = 1634 14+64+34+44=1+1296+81+256=1634。
2. 实现流程
- 遍历0到10000之间的每一个整数。
- 对于每个整数,通过取余和除法运算分离出它的每一位数字。
- 如果是三位数,分离出百位、十位、个位数字,计算它们的立方和并与该数本身进行比较,若相等则为水仙花数。
- 如果是四位数,分离出千位、百位、十位、个位数字,计算它们的四次方和并与该数本身进行比较,若相等则为水仙花数。
3. 实例代码
#include <stdio.h>
#include <math.h>
int main() {
printf("0 - 10000中的水仙花数为:\n");
// 遍历0到10000之间的所有数
for (int i = 0; i <= 10000; i++) {
int num = i;
int sum = 0;
int digit_count = 0;
int temp = num;
// 计算数字的位数
while (temp!= 0) {
digit_count++;
temp /= 10;
}
temp = num;
// 根据位数分离数字并计算各位数字的幂和
if (digit_count == 3) {
// 三位数的情况
while (temp!= 0) {
int digit = temp % 10;
sum += (int)pow(digit, 3);
temp /= 10;
}
} else if (digit_count == 4) {
// 四位数的情况
while (temp!= 0) {
int digit = temp % 10;
sum += (int)pow(digit, 4);
temp /= 10;
}
}
// 判断是否为水仙花数并输出
if (sum == num) {
printf("%d ", num);
}
}
printf("\n");
return 0;
}
以上代码分析:
- 首先通过一个
for
循环遍历0到10000之间的所有整数。 - 对于每个整数,先计算出它的位数(通过不断除以10并计数)。
- 然后根据位数,如果是三位数就计算各位数字的立方和,如果是四位数就计算各位数字的四次方和。
- 最后将计算得到的幂和与该数本身进行比较,若相等则输出该数,即为找到的水仙花数。
4. 输出
0 - 10000中的水仙花数为:
0 1 153 370 371 407 1634 8208 9474
5. 优化
比如考虑是101-1000范围内的:
#include<stdio.h>
int main(void)
{
int nNum, nRes, n, q;
for(nNum = 101; nNum < 1000; nNum++)
{
nRes = 0;
q = nNum;
while(q != 0)
{
n = q % 10;
nRes += n*n*n;
q /= 10;
}
if(nRes == nNum)
printf("%d是水仙花数\n", nNum);
}
return 0;
}
标签:10,digit,10000,temp,int,C语言,水仙花
From: https://blog.csdn.net/MrHHHHHH/article/details/144070480