每日一题——“水仙花数”

 哈喽大家好,我是保护小周ღ,本期为大家带来的是求“水仙花数”,此水仙花,非彼水仙花,一起来看看把~

 

题目:

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

描述:

“水仙花数”是指一个n位数,其各位数字的n次方之和刚好等于该数本身,如:153=1^3+5^3+3^3,则153是一个“水仙花数”。

注意范围是0~100000之间的所有符合描述的“水仙花数”。

思路解析:

根据描述,我们知道,各位数字的n次方之和刚好等于该数本身才能称之为“水仙花数”,先尝试判断一个数是否为水仙花数,怎么判断呢?

第一步:求出该数的位数n。

第二步:求出该数每一位的n次方之和。

第三步:判断该数字的n次方之和是否刚好等于该数本身

本次博主给大家带来两种解题方式,思路都是一样的,普通计数,递归计数。

普通计数:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

//统计每一个数的位数
int Count(int size)
{
	int n = 0;
	while (size)
	{
		size = size / 10;
		++n;
	}
	return n;
}

//判断是否为水仙花
int IfDaffodil(int i,int n)
{
	int size = i;
	int sum = 0;
	//判断是否为符合“水仙花”
	while (size!=0)
	{
		int ssum = 1;
		//ssum统计每一位的n次方
		for (int j = 0; j < n; j++)
		{
			ssum *= size % 10;
		}
		size = size / 10;
		//sum统计各位的n次方之和
		sum += ssum;
	}
	//各位数字的n次方之和确好等于该数本身
	if (sum == i)
	{
		return 1;
	}
	else
	{
		return 0;
	}
}
int main()
{
	//遍历区间
	for (int i = 0; i <= 100000; ++i)
	{
		//当程序执行IfDaffodil时,会先执行完作为“参数”的Count,等Count执行完毕再执行自己
		int size=IfDaffodil(i, Count(i));
		if (size == 1)
		{
			printf("%d ",i);
		}
		else
		{
			continue;
		}
	}
	return 0;
}

 递归计数:

#include<stdio.h>
//统计每一个数的位数
int Count(int n)
{
	if (n < 10)//当该数只剩个位时,递归结束
		return 1;
	else
		return Count(n / 10) + 1;
	/*
	{
	  n=n/10;
	  return Count(n)+1;
	}
	*/
}

//计算每一位的n次方
int Pow(int x, int n)
{
	if (n == 0)
		return 1;
	else
		return pow(x, --n) * x;//x^n
}

int main()
{
	//遍历区间
	for (int i = 0; i < 100000; ++i)
	{
		int n = i;
		int sum = 0;
		//判断是否为符合“水仙花”
		while (n)
		{
			//n % 10 拿到最后一位,然后根据本身的位数求次方
			sum += (Pow((n % 10), Count(i)));//Pow计算每一位的n次方
			n /= 10;
		}
		if (sum == i)
		{
			printf("%d ", sum);
		}
		else
		{
			continue;
		}
	}

	return 0;
}

感兴趣的朋友可以用博主的方法,或者是自己的方法做做这道题。

分享一个牛客网上类似的题目,大家也可以尝试着做一做。

链接:水仙花数_牛客题霸_牛客网

感谢每一个观看本篇文章的朋友,更多精彩敬请期待:保护小周ღ  *★,°*:.☆( ̄▽ ̄)/$:*.°★* 

  如有侵权请联系修改删除!

  • 19
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

保护小周ღ

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

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

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

打赏作者

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

抵扣说明:

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

余额充值