一、问题
“水仙花数”是指一个n位数,其各位数字的n次方之和确好等于该数本身,如:153=1^3+5^3+3^3,则153是一个“水仙花数”。
二、思路
这里求0~100000以内的水仙花数示范
1. 生成0~100000的数
int num = 0; //从0~100000
for (num = 0; num <= 100000; num++)
{
}
2.计算num的位数
int getn(int x) //计算n
{ // x->num
int n = 1;
while (x > 9)
{
x /= 10;
n++;
}
return n;
}
3.num每一位的n次方相加的和与num相等就是水仙花数
int ifn(int a, int n,int b)
{ //a->num n->n b->sum
if (a >= 10)
{
for (int x = 1; x <= n; x++) //x控制变量,让循环进行n次
{
int y = 1;
int i = a % 10; //i是num每一个位上的数
a /= 10; //num删掉i后剩下的数
for (int j = 0; j < n; j++) //j控制变量,让循环进行n次
{
y *= i; //生成i的n次方,存放到y
}
b += y; //b是y之和,也就是要求的sum
}
return b;
}
else //个位数( 0 ~ 9 )一定是水仙花数
return a;
}
三、代码全貌
int getn(int x) //计算n
{ // x->num
int n = 1;
while (x > 9)
{
x /= 10;
n++;
}
return n;
}
int ifn(int a, int n,int b)
{ //a->num n->n b->sum
if (a >= 10)
{
for (int x = 1; x <= n; x++) //x控制变量,让循环进行n次
{
int y = 1;
int i = a % 10; //i是num每一个位上的数
a /= 10; //num删掉i后剩下的数
for (int j = 0; j < n; j++) //j控制变量,让循环进行n次
{
y *= i; //生成i的n次方,存放到y
}
b += y; //b是y之和,也就是要求的sum
}
return b;
}
else //个位数( 0 ~ 9 )一定是水仙花数
return a;
}
int main()
{
int num = 0; //从0~100000
int n = 1; //num的位数
for (num = 0; num <= 100000; num++)
{
int sum = 0; //num每一位上的数的n次方相加,存在sum里,和num相等就是水仙花数
n = getn(num); //计算n
sum = ifn(num, n, sum); //计算sum
if (num == sum)
printf("%d ", num);
}
return 0;
}