【前言】
今天是刷题打卡第35天!
不负代码不负卿,加油老铁们。
原题:水仙花数(自幂数)
题目描述:
打印1~100000之间的水仙花数,水仙花数指的是一个n 位数,其各位数字的n 次方之和刚好等于该数本身。
示例:
153 = 1^3 + 5^3 + 3^3
思路:
- 先判断是几位数
- 再求每一位的n 次方之和(模十除十)
错误示范:
#include<stdio.h>
#include<math.h>
int main()
{
int i = 0;
for (i = 0; i <= 100000; i++)
{
int sum = 0;
int n = 1;//每一个数最少是一个一位数
//先判断是几位数
while (i /= 10)
{
n++;//注意n 要初始化成1开始
}
//再求每一位数字的n次方之和
while (i)
{
sum += pow(i % 10, n);
i /= 10;
}
if (sum == i)
{
printf("%d ", i);
}
}
return 0;
}
上面的代码好像逻辑没啥问题,但是实际上是有大问题的,因为i 在循环体内部是不断变化的,这是很危险的,更是错误的!
正确代码:
#include<stdio.h>
#include<math.h>
int main()
{
int i = 0;
for (i = 0; i <= 100000; i++)
{
int temp = i;
int sum = 0;
int n = 1;//每一个数最少是一个一位数
//先判断是几位数
while (temp /= 10)
{
n++;//注意n 要初始化成1开始
}
//再求每一位数字的n次方之和
temp = i;//注意这一步!
while (temp)
{
sum += pow(temp % 10, n);
temp /= 10;
}
if (sum == i)
{
printf("%d ", i);
}
}
return 0;
}
高大上函数包装:
结语
今天是刷题打卡第35天!
加油吧少年。