前言
水仙花数只是自幂数的一种,严格来说3位数的3次幂数才称为水仙花数,它的每个数位上的数字的 3次幂之和等于它本身。例如:1^3 + 5^3+ 3^3 = 153。
今天我们为了普遍性就求0~100000的自幂数,希望大家有所收获
法1:
#include <stdio.h>
#include <math.h>//pow的头文件
//求出0~100000之间的所有“水仙花数”并输出
int main()
{
int i = 0;
int j = 0;
int a = 0;
int s = 0;
int n = 0;
printf("0 ");//0一定是水仙花数,就不判断了,直接打印,不然后面while(i)不好办
for (i = 1; i <= 100000; i++)
{
s = 0;//初始化
n = 0;//初始化
j = i;//保存i的值
while (i)
{
i = i / 10;//去掉一位数
n++;//i的位数
}
i = j;//恢复i的值
while (i)
{
a = i % 10;//尾数 没去掉一位数都取尾数进行n次方加和,这样就相当于各个位数的n次方加和了
s += pow(a,n);
i = i / 10;//去掉一位数
}
if (s == j)
{
printf("%d ", j);
}
i = j;//恢复i的值,让for循环在i的基础上++
}
printf("\n");
return 0;
}
法2:
#include <stdio.h>
#include <math.h>
void NarcissisticNumber()
{
for (int i = 0; i < 99999; i++)
{
//i = 153
int count = 0;//位数
int tmp = i;
while (tmp != 0)
{
count++;
tmp /= 10;
}
//tmp == 0 count == 3
tmp = i;//153
//求tmp的每一位
int sum = 0;
while (tmp != 0)
{
sum += pow(tmp % 10, count);
tmp /= 10;//15
}
if (sum == i)
{
printf("%d ", i);
}
}
}
int main()
{
NarcissisticNumber();
printf("\n");
return 0;
}