少爷 公主们请看题,首先先来介绍一下什么是”水仙花数":
“水仙花数”是指一个n位数,其各位数字的n次方之和确好等于该数本身,如:153=1^3+5^3+3^3,则153是一个“水仙花数”。
那么由上可知,如何确定它是一个“水仙花数”,首先我们要确定它是一个几位数,然后把它的每一位分离出来,最后再来看看分离出来的每一位的n次方是否等于它本身。既然我们大概有了一个思路,接下来就开始逐步写。
我们写一个函数来判断它是不是水仙花数:
int isShui(int a)
{
}
首先我们先判断它是一个几位数:
while (a != 0)
{
a /= 10;
++n;
}
接下来就是把它的每一位分离出来,假设为1234,那么1234%10=4(分离出来4),然后再1234/10=123(为下一次分离3出来),接着就是123的分离,如此的重复上述步骤。直到n/10=0,我们就结束循环,那么我们可以如此写道:
while (a != 0)
{
b = a % 10;
result += pow(b, n);
a /= 10;
}
但是我们写到这一步发现:上面我们在计算是几位数时,我们改变了a的值,而后面在分离时也要用到a,所以我们要保证a的值在此期间不能有所改变!所以此时我们可以借助另外一个数来等于a,使其保证不会被改变:
int isShui(int num)
{
int a, b;
int n = 0;
int result = 0;
a = num;
//计算是几位数
while (a != 0)
{
a /= 10;
++n;
}
a = num;
while (a != 0)
{
b = a % 10;
result += pow(b, n);
a /= 10;
}
}
接下来就是根据其返回值来判断是不是水仙花数,假设我们规定1为其水仙花数,0则表示不是:
int isShui(int num)
{
int a, b;
int n = 0;
int result = 0;
a = num;
//计算是几位数
while (a != 0)
{
a /= 10;
++n;
}
a = num;
while (a != 0)
{
b = a % 10;
result += pow(b, n);
a /= 10;
}
if (num < 10)
return 0;
if (result == num)
return 1;
else
return 0;
}
那么最后就是我们主函数了,主函数就很容易了,接下来我们就来看看整体的代码:
int isShui(int num)
{
int a, b;
int n = 0;
int result = 0;
a = num;
//计算是几位数
while (a != 0)
{
a /= 10;
++n;
}
a = num;
while (a != 0)
{
b = a % 10;
result += pow(b, n);
a /= 10;
}
if (num < 10)
return 0;
if (result == num)
return 1;
else
return 0;
}
int main()
{
printf("水仙花数:\n");
for (int i = 1; i < 100000; i++)
{
if (isShui(i))
{
printf("%d\n", i);
}
}
return 0;
}
看看运行效果:
少爷 公主你学废了吗?