题目描述:
求出0~999之间的所有“水仙花数”并输出
水仙花数:一个三位数,数的各个位上的立方和等于该数本身,例如 153=1^ 3+5^ 3+3^3
解题思路及代码实现:
方法一: 将0-999的数依次循环进行 位数计算,自幂求和,与原数比较的三个步骤
for (i = 0; i < 1000; i++)
{ //计算位数
int count = 1;
int tmp = i;
int sum = 0;
while (tmp / 10)
{
count++;
tmp = tmp / 10;
} //计算次方和
tmp = i;
while (tmp)
{
sum += pow(tmp % 10, count);
tmp = tmp / 10;
} //判断
if (sum == i)
printf("%d ", i);
}
方法二: 将0-999的数依次循环进行 计算每个位上的数,对每个位上的数进行相应的幂运算求和,和与原数比较的三个步骤
int i = 0;
int sum = 0;
printf("水仙花数是:");
for (i = 0; i < 1000; i++)
{
int tmp = i;
int a = tmp / 100; //求出百位数
int b = tmp % 100 / 10; //求出十位数
int c = tmp % 100 % 10; //求出个位数
if (a != 0) //三位数时计算和
sum = (int)pow(a, 3) + (int)pow(b, 3) + (int)pow(c, 3);
if (a == 0 && b != 0) //两位数时计算和
sum = (int)pow(b, 2) + (int)pow(c, 2);
if (a == 0 && b == 0) //一位数时计算和
sum = c;
if (sum == i) //判断
printf("%d ", i);
}
完整代码
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include<stdlib.h>
#include<math.h>
int main()
{
int i = 0;
for (i = 0; i < 1000; i++)
{ //计算位数
int count = 1;
int tmp = i;
int sum = 0;
while (tmp / 10)
{
count++;
tmp = tmp / 10;
} //计算次方和
tmp = i;
while (tmp)
{
sum += pow(tmp % 10, count);
tmp = tmp / 10;
} //判断
if (sum == i)
printf("%d ", i);
}
system("pause");
return 0;
}