弟弟9•打印水仙花数

本文详细介绍了如何用C语言编程求解0~100000之间的水仙花数,提供了两种方法:纯for循环和for+while循环,并解释了库函数pow在计算过程中如何使用。两者的运行结果相同。
摘要由CSDN通过智能技术生成

题目

求出0~100000之间的所有“水仙花数”并输出。

水仙花数的定义

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

解法一(纯for循环)

这个代码用来理解基本思路,学了for循环就可以了。

#include<stdio.h>
int main()
{
//水仙花数是三位数,从100开始,这题目混淆视听,生气气!
	for (int i = 100; i < 1000; i++)
	{
		int a = i % 10;
		int b = (i / 10) % 10;
		int c = i / 100;
		if (i == a * a * a + b * b * b + c * c * c)
		{
			printf("%d ", i);
		}
	}
	for (int i = 1000; i < 10000; i++)
	{
		int a = i % 10;
		int b = (i / 10) % 10;
		int c = (i / 100) % 10;
		int d = i / 1000;
		if (i == a * a * a * a + b * b * b * b + c * c * c * c + d * d * d * d)
		{
			printf("%d ", i);
		}
	}
	for (int i = 10000; i < 100000; i++)
	{
		int a = i % 10;
		int b = (i / 10) % 10;
		int c = (i / 100) % 10;
		int d = (i / 1000) % 10;
		int e = i / 10000;
		if (i == a * a * a * a * a + b * b * b * b * b + c * c * c * c * c + d * d * d * d * d +e * e * e * e * e)
		{
			printf("%d ", i);
		}
	}
	printf("\n");
	return 0;
}

解法二(for+while循环)

#include <stdio.h>
#include <math.h>
int main()
{
	int i = 0;
//水仙花数是三位数,从100开始,这题目混淆视听,生气气!
	for(i=100; i<=99999; i++)
	{
		int count = 1;
		int tmp = i;
		int sum = 0; 
		while(tmp/10)
		{
			count++;
			tmp = tmp/10;
		}
		tmp = i;
		while(tmp)
		{
			sum += pow(tmp%10, count);
			tmp = tmp/10;
		}
		if(sum == i)
			printf("%d ", i);
	}
	printf("\n");
	return 0;
}

❤️for循环确定要排查的范围。

❤️定义变量并初始化【count是指数,tmp是底数。】

❤️i<10的进不去while(tmp/10),因为tmp=i,所以这时候tmp/10=0【’ / ’ 运算会把小数抹掉,比如9/10=0(把0.9的小数9抹掉)】,0为假,进不了循环。但 i>10 就能进了,比如11。

讲解while(tmp/10)

 while(tmp/10)
		{
			count++;
			tmp = tmp/10;
		}

❤️while(tmp/10)的作用:计算指数。
指数count从1开始。
以下i=tmp,只是遍历喜欢说i
当 i 为两位数时,可以进入循环,count+1=2【对应代码是 tmp = tmp/10; 】,两位数再 “/10” 就为0了 ,0为假,进不了循环。
当 i 为三位数时,循环条件while(tmp/10)的结果为两位数,不为0,进入循环,count+1=2;加加完后继续往下执行 tmp = tmp/10; ,即tmp变成了两位数,然后就是上面对于i为两位数的情况的解释了,只不过 新count=旧count+1=2+1=3。循环。
i为其它位数同理。

❤️以下图片中 tmp = i; 的作用是避免tmp=i被它上面while循环中的操作改变,影响下面的操作。
在这里插入图片描述
❤️满足定义就打印。

库函数pow的使用

 while(tmp)
		{
			sum += pow(tmp%10, count);
			tmp = tmp/10;
		}

格式为pow(底数,指数);

如pow(7,3)即7的3次方,pow(7,3)=777=343。
此处*tmp = tmp/10;*的作用是更新位数,比如111/10=11,由三位数变成两位数。

sum += pow(tmp%10, count);中 tmp%10 的作用是取最后一位作为底数,如123%10=3。【’ % ’ 的作用是取余】

运行结果(两个代码都一样)

在这里插入图片描述

加油

今天的你又向目标迈进了!

❤️❤️❤️ 恭喜! 恭喜! 又收了一名小弟! ❤️❤️❤️

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值