判断水仙花数——C语言

本文介绍了水仙花数的概念,展示了如何通过编程实现判断一个数字是否为水仙花数的算法,包括提取每位数字、计算n次幂和并与原数比较的过程。
摘要由CSDN通过智能技术生成
1.什么是“水仙花数”?

水仙花数是指一个数字,它的每个数位上的数字的 n次幂之和等于它本身。(其中n为水仙花数的总位数)例如:1^3 + 5^3+ 3^3 = 153。

三位的水仙花数共有4个:153,370,371,407;

四位的四叶玫瑰数共有3个:1634,8208,9474;

五位的五角星数共有3个:54748,92727,93084;

六位的六合数只有1个:548834;

七位的北斗七星数共有4个:1741725,4210818,9800817,9926315;

八位的八仙数共有3个:24678050,24678051,88593477;

九位的九九重阳数共有4个: 146511208,472335975,534494836,912985153;

十位的自幂数只有1个:4679307774

2.代码原理分析: 

底层逻辑:水仙花数的每一位数字的三次方之和等于它本身;那么我们需要提取出该数字的每一位,对其的三次方进行求和与水仙花数本身进行比较,判断可以得到其是否是水仙花数

1.首先判断是几位数:
int n=1;
while(temp/10)
{
    n++;
    temp=temp/10;
}

temp就为水仙花数,我们对其/10,每除一个10,即可去掉一位数字,所以进行累加即可得到其对应的数字个数;

那么为什么n从1开始累加,而不是0呢?

原因:temp/10当水仙花数是一位数时,在刚进入循环时temp/10就为0,那么就不会进入循环进行n的累加,所以初始化设置n为1,不进入循环即默认为1位数字;

2.提取数字,并进行累加:
temp=i;
int sum=0;
while(temp)
{
    sum+=(int)pow(temp%10,n)//在此处调用math.h库函数
    temp=temp/10;
}

对temp(水仙花数)进行取模运算,那么即可得到每一位数字;注意每次取模运算完成后,将temp/10,进行下一位数的提取;

调用库函数math.h,其中pow函数的结构为:double pow(double base,double exponent);其返回值为double类型的,而sum为整型变量,那么我们对pow的结果进行强制类型转换;

3.进行判断比较;
if(sum==i)
{
   printf("%d ",i);
}

那么要是判断某个范围内的水仙花数,我们需要对其一一进行上述判断,所以我们引入for循环,作为整个代码的大框架;

for(i=0;i<10000;i++)
{
      ;
}
3.完整代码示例:
#include<stdio.h>
#include<math.h>
int main()
{
	int i = 0;
	for (i = 0; i <=100000; i++)
	{
		int n = 1;//每次循环都对应着一个新的需要进行判断的值,那么每次的n值都应该重新进行累加
		//如果不放在内部的话,n的值在初始的时候就不再是1,而是已经进行累加过的值,不符合代码要求

		int temp = i;//用来存储i的值,防止i被改变;

		//判断该数是几位数!
		while (temp / 10)//为什么n的初始值设为1;因为当为1位数时,temp/10就为0,不进入while循环,n的值也不会进行累加,
			//所以初始值设为1,1位数才可有后面的n次方;
		{
			n++;//
			temp = temp / 10;
		}

		//进行累加;
		temp = i;//重新将i赋给temp;
		int sum = 0;
		while (temp)
		{
			sum+=(int)pow(temp % 10, n);//因为pow的返回值为double类型的,所以需要将其强制转换成int型防止报错警告
			//调用pow(math.h)库函数,pow(a,b),计算a的b次方;
			temp = temp / 10;//去掉最后一个数字
		}
		if (sum == i)
		{
			printf("%d\n", i);
		}
	}
	return 0;
}

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值