c语言刷题——求出0~100000之间的所有“水仙花数”并输出

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.运行结果



 


 

评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mljy.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值