水仙花数是指一个 n 位数(n≥3 ),它的每个位上的数字的 n 次幂之和等于它本身(例如:1^3 + 5^3+ 3^3 = 153)。下面前两种方法是求3位数的水仙花数,最后一种方法扩展到n位,供大家参考。
第一种方法代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int main()
{
int i = 0;
int j = 0;
int k = 0;
for (i = 0; i < 10; i++)//百位上的数
{
for (j = 0; j < 10; j++)//十位上的数
{
for (k = 0; k < 10; k++)//个位上的数
{
if (i * 100 + j * 10 + k * 1 == pow(i, 3) + pow(j, 3) + pow(k, 3))
{
printf("%d ", i * 100 + j * 10 + k * 1);
}
}
}
}
system("pause");
return 0;
}
第二种方法代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int main()
{
int a = 0;//个位上的数
int b = 0;//十位上的数
int c = 0;//百位上的数
int i = 0;
for (i = 100; i < 999; i++)
{
a = i % 10;//求得个位上的数
c = i / 100;//求得百位上的数
b = (i - c * 100) / 10;//求得十位上的数
if (pow(a, 3) + pow(b, 3) + pow(c, 3) == i)
{
printf("%d ", i);
}
}
system("pause");
return 0;
}
第三种方法,是对3位数水仙花数的一个扩展,即n位水仙花数。基本思想是先求得这个数的位数,再求得各个位上的次方和,进而求得这个数,下面是具体实现代码:
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int main()
{
int i = 0;
for (i = 0; i < 10000000; i++)
{
int tmp = i;//创建一个临时变量,因为i是循环变量,不能改变
int count = 1;//这个数的位数。这里count的值要初始化为1,因为任意一个数最起码也有一位,0也有一位
int sum = 0;
//1.求数的位数
while (tmp / 10)//这里循环条件要写tmp/10,如果直接写tmp,count出来的结果会比正确的结果多1,因为count初始化时值为1
{
count++;
tmp = tmp / 10;
}
//2.求各个位的次方和
tmp = i;//将i的值赋给临时变量tmp
while (tmp)
{
sum = sum + (pow(tmp % 10, count));//tmp%10求得一个十进制数最低位的数字
tmp = tmp / 10;//tmp/10去掉一个十进制数最低位的数字,以此循环,直到这个数为0
}
if (sum == i)
{
printf("%d ", sum);
}
}
system("pause");
return 0;
}