一、题目描述
求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日