1.题目分析
首先我们要了解什么是“水仙花数”,“水仙花数”是指一个n位数,其各位数字的n次方之和确好等于该数本身,如:153=1^3+5^3+3^3,则153是一个“水仙花数”
注:在本文章中在实现各功能时采取了调用自定义函数的方法,这会使得程序主函数更加简洁
因此我们应该如何实现以上的功能呢?
1.首先要遍历0~100000所有的整数要使用到循环语句,为了使代码看上去更简洁,在本篇的代码中用到的是for循环
2.在遍历过程中要得到数的位数,可以调用一个计算整数的函数
3.在遍历过程中还要得到各位数字的n次方之和,这就也要调用一个可以实现该功能的函数
4.判断在实现各位数字的n次方之和函数的返回值是否会等于该数本身,若等于则就输出该数,不等于就不输出
2.代码实现
1.主函数部分
要实现以上功能就要创建一个main函数 同时在函数体内编写整个程序主体逻辑代码
在以上代码中遍历了1~100000所有都整数 每次i在通过整个for循环后都会进入调整部分,实现i++,直到i超过额定的范围就停止循环
注:在以上代码中注释了各变量和语句的作用
2.SN函数部分
利用while可实现一个数位数的统计
例如传给形参的数为12,则a=12 进入while循环,a/10=1,结果为非零counts++,a=a/10=1,在进入while循环a/10结果等于0为假跳出循环,最终counts就为2 说明12位数是2 return counts返回值到主函数的n内
3.CN函数部分
FN函数
在CN函数内还有调用FN函数来实现计算一个数的n次方,以下是应用了函数递归实现该功能的
以上函数递归的限制条件是当 n=1时,当n=1时就停止递推开始回归
非递推法
实现计算一个数的n次方除了用以上函数递归的方法还可以直接应用库函数pow来实现该功能
但pow的参数部分需是双精度浮点型变量,而以上的j和n都是整形变量,这时我们该怎么办呢?
这时就可以用到强制类型转换
注:使用库函数pow要引用头文件#include<stdio.h>
以下是利用pow实现的CN函数
3.程序代码完全体
1.使用自定义FN函数
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<math.h>
int FN(int j, int n)
{
if (n == 1)
{
return j;
}
else
{
return j* FN(j, n - 1);
}
}
int SN(int a)
{
int counts = 1;//counts用于统计有几位数
while (a / 10)//while循环实现位数计算功能
{
counts++;
a = a / 10;
}
return counts;
}
CN(int i, int j, int n, int sum, int crt)
{
while (i)//while循环实现计算各位数字的n次方之和
{
j = i % 10;//取出i的最末位数
int crt = FN( j, n);//调用FN函数实现计算末位数的n次方
sum += crt;//sum存储每次循环时末位数的n次方
i = i / 10;//将此时i末位数去掉
}
return sum;
}
int main()
{
int i = 0;
printf("0~100000之间的所有“水仙花数”有以下数\n");
for (i = 0; i <= 100000; i++)//遍历1~100000的数
{
int n = SN(i);//调用该函数计算有几位数
int sum = 0;
int crt = 0;//crt用来表示该数其中每位的n次方
int j = 0;//j用来表示该数其中的一个位数
sum = CN(i, j, n, sum, crt);//调用该函数计算各位数字的n次方之和
if (sum == i)//判断其各位数字的n次方之和是否确好等于该数本身
{
printf("%d ", i);//输出满足条件的数
}
}
return 0;
}
2.使用库函数pow函数
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<math.h>
int SN(int a)
{
int counts = 1;
while ( a /10 )
{
counts++;
a = a / 10;
}
return counts;
}
CN(int i,int j,int n,int sum,int crt)
{
while (i)
{
j = i % 10;
int crt = (int)pow(j, n);
sum += crt;
i = i / 10;
}
return sum;
}
int main()
{
int i = 0;
printf("0~100000之间的所有“水仙花数”有以下数\n");
for (i = 0; i <= 100000; i++)
{
int n = SN(i);//计算有几位数
int sum = 0;
int crt = 0;
int j = 0;
sum=CN(i,j,n,sum,crt);//计算各位数字的n次方之和
if (sum == i)//判断其各位数字的n次方之和是否确好等于该数本身
{
printf("%d ",i);
}
}
return 0;
}
4.运行结果