第十三弹--水仙花数and水仙花数plus

求水仙花数

定义:水仙花数是指一个 3 位数,它的每个数位上的数字的 3次幂之和等于它本身。例如:1^3 + 5^3+ 3^3 = 153。

根据定义可知 目标是求出该数数位3次方之和然后和本身比较 和本身相同则是水仙花数。

考虑如何获取数位数值

暴力获取法

int a = tmp % 10;//取模获取个位 tmp 为3位数临时值
int b = (tmp / 10) % 10;//去掉个位 取模获得十位
int c =(tmp / 100) % 10;//去掉个位 十位 取模获得百位

循环判断进行比较 符合定义则打印

for(int i = 100;i <= 999;i++)
{
	int tmp = i;//为了后续比较 使用tmp接收i值
	//获取个位十位百位值 如上
	if((a * a * a + b * b * b + c * c * c)==i)
	{
	printf("%d ",i);
	}
}

完整代码

#include 
         
int main()
{
	for (int i = 100; i <= 1000; i++)
	{
		int tmp = i;
		int a = tmp % 10;
		int b = (tmp / 10) % 10;
		int c = (tmp / 100) % 10;
		if ((a * a * a + b * b * b + c * c * c) == i)
		{
			printf("%d ",i);
		}
	}
	return 0;
}

水仙花数plus版本(求1-10000内符合定义的数)

此时就不再是求水仙花数,而是求 数位*位数等于本身的数!

因为位数不同 所以次方也会不同 第一步就需要求位数

一、求位数

把i赋值给tmp 每次符合循环条件位数++ 循环结束 获得位数

int count = 1;//使用count 来当做位数
int tmp = i;
while(tmp / 10)//因为count定义时是1 故把tmp/10作为循环条件
{
	count++;//最终获得位数
	tmp /= 10;
}

二、求数位对应的值

使用pow函数计算出每一个位数对应表的值,使用sum求和

每求完一个位数之后 tmp/10 使得求下一位数对应的值

int tmp;//注意这个位置 需要二次赋值
while(tmp)
{
	sum += pow(tmp % 10,count);//使用函数(需要加头文件math.h) pow(值,次方值)
	tmp /= 10;
}

三、符合条件打印

if(sum == i)
{
printf("%d ",i);
}

总代码

#include 
#include 

int main()
{
	for (int i = 1; i < 100000; i++)
	{
		int count = 1;
		int sum = 0;
		int tmp = i;
		while (tmp / 10)
		{
			count++;
			tmp /= 10;
		}
		tmp = i;
		while (tmp)
		{
			sum += pow(tmp % 10, count);
			tmp /= 10;
		}
		if (sum == i)
		{
			printf("%d ", i);
		}
	}
	return 0;
}

关于pow可以选择使用现成函数 也可以选择自己创建一个求次方函数值。

如有问题 请多多指教!谢谢

你可能感兴趣的:(c语言)