#include <math.h>
int main()
{
for (int i = 1; i <= 100000; i++)
{
int count = 0;
int sum = 0;
int tmp = i;
while (tmp)//判断水仙花数的位数
{
tmp /= 10;
count++;
}
tmp = i;
while (tmp)
{
int shui= pow(tmp % 10, count);
sum = sum + shui;
tmp /= 10;
}
if (sum == i)
{
printf("%d ", i);
}
}
return 0;
}
大家注意:1.由于for是使用了个while,while中的判断条件是由i决定的,我的想法是第一个while判断用i,第二个判断之前用一个变量tmp来接收i(我以为这样的话i就是原来的值了,然而不是。)
错误的代码和结果:
int main()
{
for (int i = 1; i <= 100000; i++)
{
int count = 0;
int sum = 0;
while (i)//判断水仙花数的位数
{
i /= 10;
count++;
}
int tmp = i;
while (tmp)
{
int shui= pow(tmp % 10, count);
sum = sum + shui;
tmp /= 10;
}
if (sum == i)
{
printf("%d ", i);
}
}
return 0;
}
经过调试,我才明白 当把i放到while判断条件里的时候i就已经改变,即使后面用tmp再来储存也无济于事
所以我们的中心思想是i除了执行for自增之外,不能再改变,所以就有了开头的代码。
所以在一开始我们就要用tmp来储存i,在第二个判断之前 只需将tmp重新赋予i的值就行了。
2.还有一个细节第一个while的判断条件一般的答案是这样的
仔细思考一下,只要将tmp/10改成tmp,count改成0,就是一样的效果。而且还更加简便。
3.再仔细一想,用函数封装的思想就不会有这种问题。
#include <math.h>
int countN(int i)
{
int count = 0;
while (i)
{
i /= 10;
count++;
}
return count;
}
int is_shui(int i, int n)
{
int sum = 0;
while (i)
{
sum += pow(i % 10, n);
i /= 10;
}
return sum;
}
int main()
{
for (int i = 0; i <= 100000; i++)
{
int n = countN(i);//判断是几位数
int ret = is_shui(i, n);//判断是否为水仙花数
if (i == ret)
{
printf("%d ", ret);
}
}
return 0;
}
希望我的修正与整理能帮到大家!!!