前言:此题解并非最优解,而是通过大众的思路一步步求解。
题目:打印1~10000之间的水仙花数
求出0~100000之间的所有“水仙花数”并输出。
“水仙花数”是指一个n位数,其各位数字的n次方之和确好等于该数本身,如:153=1^3+5^3+3^3,则153是一个“水仙花数”。
思路
首先我们可以从题目中水仙花的定义看出我们在编程时需要的东西。
“其各位数字的n次方之和确好等于该数本身”这句话就提示我们需要的参数
1.数字
2.判断这个数是几位数
3.求出每一位并且算出他的n次方
4.相加判断
题解
1~10000的数字肯定是用到循环,这里我们使用for循环,不过我们应该怎样求这个数字的位数呢?
我们知道122%10得到的就是2,正好是这个数字的个位,再用122/10=12,再进行取余就得到了这个数的十位,这下连怎么解决每一位数字的问题都解决了。
我们用while循环解决,如果这个数字不等于0,就一直进行取余,除法操作,每次循环count都会加1来接收位数。
for (int i = 0; i <= 10000; i++)
{
int num = i;//改变数字
int count = 0;//用于接收位数
while (num)
{
int p = num % 10;
num = num / 10;
count++;
}
可能有同学奇怪,为什么不用while(i)呢?因为如果用i的话,会改变我们循环中的参数,中间会遗漏大量结果。
这样我们就得到了这个数的位数,进行下一步的判断操作。
其各位数字的n次方之和确好等于该数本身
在上一步操作中,我们已经了解了怎么求每一位的数字,我们现在用一个参数来接收即可。
!!!不要忘了,这一轮循环之前要把num的值变成数字i,因为在上一轮循环结束时num的值已经变成0了!!!!
我们需要求出每一位的位数次方的和,我们可以用求方函数进行,也可以用一次for循环来进行求和。
num = i;
int num1 = 0;//接收各位数之和
while (num)
{
int p = num % 10;
int p1 = p;
for (int j = 1; j < count; j++)
{
p = p * p1;
}
num1 = num1 + p;
num = num / 10;
}
!在进行for循环中计算乘方时千万注意不能是 p=p*p,假设p=2,那么下一轮就是2*2=4,再一轮就是 4*4=16了!
然后和i进行判断即可。
if (num1 == i)
{
printf("%d是水仙花数\n", i);
}
运行结果
完整代码
#include<stdio.h>
int main()
{
for (int i = 0; i <= 10000; i++)
{
int num = i;//改变数字
int count = 0;//用于接收位数
int num1 = 0;//用于判断
while (num)
{
int p = num % 10;
num = num / 10;
count++;
}
num = i;
while (num)
{
int p = num % 10;
int p1 = p;
for (int j = 1; j < count; j++)
{
p = p * p1;
}
num1 = num1 + p;
num = num / 10;
}
if (num1 == i)
{
printf("%d是水仙花数\n", i);
}
}
return 0;
}