一、题目描述
求0~100000之间的所有“水仙花数”并输出。
什么是水仙花数:
“水仙花数”是指一个n位数,其各位数字的n次方之和确好等于该数本身,如:153=1^3+5^3+3^3,则153是一个“水仙花数”。
思路:
第一步:根据题目要求产生0~100000的数字【循环就能搞定】
若想知道一个数是否为水仙花数
第二步:首先需要判断这个数(i)有几位数(用cnt统计)
第三步:计算 i 十进制的每一位与cnt的次方之和(sum)
第四步:判断这个数是否与sum相等,如果相等则输出 i
根据思路一起来敲代码吧
第一步:产生0~100000的数字
#include <stdio.h>
int main()
{
//产生0~100000的数字
for (int i = 0; i <= 100000; i++)
{
}
return 0;
}
第二步:判断 i 有几位数
让 i 循环除10,然后让cnt++,但需要注意的是,要创建一个变量来代替 i,因为 i 循环除10会改变 i 的值,最后就不能判断 i 是否等于sum
#include <stdio.h>
int main()
{
//产生0~100000的数字
for (int i = 0; i <= 100000; i++)
{
//第二步:判断 i 有几位数
int cnt = 0; //统计 i 有几位数
int tmp = i;
while (tmp)
{
tmp /= 10;
cnt++;
}
}
return 0;
}
第三步:计算 i 十进制的每一位与cnt的次方之和(sum)
这里还需要把 i 再次赋值给tmp,因为tmp在上一步已经变成了0
#include <stdio.h>
#include <math.h>
int main()
{
//第一步:产生0~100000的数字
for (int i = 0; i <= 100000; i++)
{
//第二步:判断 i 有几位数
int cnt = 0; //统计 i 有几位数
int tmp = i;
while (tmp)
{
tmp /= 10;
cnt++;
}
//第三步:计算 i 十进制的每一位与cnt的次方之和
tmp = i;
int sum = 0;
while (tmp)
{
//产生 i 的最后一位
int a = tmp % 10;
//计算每一位与cnt的次方之和
sum += pow(a, cnt); //pow函数需要包含math.h头文件
//去掉 i 最后一位
tmp /= 10;
}
}
return 0;
}
第四步:判断这个数是否与sum相等,如果相等则输出 i
这个就非常简单啦
#include <stdio.h>
#include <math.h>
int main()
{
//第一步:产生0~100000的数字
for (int i = 0; i <= 100000; i++)
{
//第二步:判断 i 有几位数
int cnt = 0; //统计 i 有几位数
int tmp = i;
while (tmp)
{
tmp /= 10;
cnt++;
}
//第三步:计算 i 十进制的每一位与cnt的次方之和
tmp = i;
int sum = 0;
while (tmp)
{
//得到 i 的最后一位
int a = tmp % 10;
//计算每一位与cnt的次方之和
sum += pow(a, cnt); //pow函数需要包含math.h头文件
//去掉 i 最后一位
tmp /= 10;
}
//第四步:判断这个数是否与sum相等
if (i == sum)
{
printf("%d ", i);
}
}
return 0;
}
程序运行结果:
但是这串代码的逻辑还是有点小问题,当i = 0时,tmp也为0,0为假,不进入循环,但是0也算一位数啊
所以可以这么改
#include <stdio.h>
#include <math.h>
int main()
{
//第一步:产生0~100000的数字
for (int i = 0; i <= 100000; i++)
{
//第二步:判断 i 有几位数
int cnt = 1; //统计 i 有几位数
int tmp = i;
while (tmp > 9)
{
tmp /= 10;
cnt++;
}
//第三步:计算 i 十进制的每一位与cnt的次方之和
tmp = i;
int sum = 0;
while (tmp)
{
//产生 i 的最后一位
int a = tmp % 10;
//计算每一位与cnt的次方之和
sum += pow(a, cnt); //pow函数需要包含math.h头文件
//去掉 i 最后一位
tmp /= 10;
}
//判断这个数是否与sum相等
if (i == sum)
{
printf("%d ", i);
}
}
printf("\n");
return 0;
}
先把cnt赋值成1,因为0~100000无论怎么样,最少都会有一位数;tmp>9,意思是超过2位数就进入循环
程序运行结果:
2023年1月9日