C语言求自幂数(水仙花数与其他自幂数)

前言

今天我们来看一下如果求解自幂数(水仙花数),水仙花数是自幂数的一种,我们来看看自幂数的概念吧,当一个n位数,它的每个位上的数字的n次幂之和等于它本身的时候,我们称这个数为自幂数。水仙花数就是三位自幂数。

以下内容来自百度百科:自幂数

水仙花数只是自幂数的一种,严格来说3位数的3次幂数才称为水仙花数。

附:其他位数的自幂数名字

一位自幂数:独身数

三位自幂数:水仙花数

四位自幂数:四叶玫瑰数

五位自幂数:五角星数

六位自幂数:六合数

七位自幂数:北斗七星数

八位自幂数:八仙数

九位自幂数:九九重阳数

十位自幂数:十全十美数

嘿嘿,感觉它们自幂数的称呼都好有意思,列出来给大家瞅瞅。

题目要求

那么今天咋们要做的就是,使用代码打印出0~100000的自幂数,我们首先需要知道怎么去求一个数字有多少位,之后如何求得每位的数字,然后再求这个数字的n次幂之和。

好啦,具体思路有了,我们上代码

代码展示

cpp 复制代码
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<math.h>
int main()
{
	int i;
	for (i = 0;i <= 100000;i++)
	{
		//计算有多少位,n
		int n = 1;
		int tmp = i;
		while (tmp>9)
		{
			tmp /= 10;
			n++;
		}
		// 计算每位数字的n次方之和
		tmp = i;
		int sum = 0;
		while (tmp)
		{
			sum += (int)pow(tmp % 10, n);
			tmp /= 10;
		}
		// 检查是否为水仙花数
		if (sum == i)
		{
			printf("%d ", i);
		}
	}
	return 0;
}

代码解析

计算位数

首先我们需要做的是遍历0~100000之间的数,我们需要在这些数字里面求符合条件的自幂数,我们使用for循环解决,之后就是求数字有多少位了,因为没有0位的数字,所以我们这里n从1开始计算。

防止我们在循环体内部再次改变i的值,我们将i的值赋给tmp,让tmp来代替i进行运算,我们使用while循环,当我们的tmp,也就是i>9的时候进入循环,为什么是9呢,因为从0到9都是自幂数,之前我们从百度百科了解到,0~9的自幂数被称为独身数。我们使用除10的方式来计算这个数字有多少位,当最后一次除10之后tmp小于9退出循环,n加1。这样我们就得到了这个数字的位数。

cpp 复制代码
		int n = 1;
		int tmp = i;
		while (tmp>9)
		{
			tmp /= 10;
			n++;
		}

计算数字各个位的n次幂之和

我们知道这个数字是多少位之后就可以开始计算这个数字每位的n次幂之和了,设置一个变量sum用来接收求得的n次幂之和,我们这里使用一个数学函数pow,在pow函数中我们先使用给这个数字%10的方式求得个位数的n次幂,之后将这个数字/10之后继续运算。

以1314为例,我们将1314%10之后得到的是4,求出4的4次幂之后,我们将1314/10之后得到131,再次%10运算之后得到1,再求1的4次幂,与之前求得的4的4次幂相加。

cpp 复制代码
		tmp = i;
		int sum = 0;
		while (tmp)
		{
			sum += (int)pow(tmp % 10, n);
			tmp /= 10;
		}

最后我们判断所求数各个位n次幂之和sum与i(他本身)是否相等,如果相等,那么这个数就是自幂数。我们将这些自幂数打印出来。

运行结果

相信大家都听说过水仙花数,今天带大家了解一下自幂数,希望大家有所收获,如果有问题评论区留言告诉我哦!大家再见!

相关推荐
励志要当大牛的小白菜1 小时前
ART配对软件使用
开发语言·c++·qt·算法
爱装代码的小瓶子3 小时前
数据结构之队列(C语言)
c语言·开发语言·数据结构
Maybe_ch5 小时前
.NET-键控服务依赖注入
开发语言·c#·.net
超浪的晨5 小时前
Java UDP 通信详解:从基础到实战,彻底掌握无连接网络编程
java·开发语言·后端·学习·个人开发
终焉暴龙王5 小时前
CTFHub web进阶 php Bypass disable_function通关攻略
开发语言·安全·web安全·php
快乐飒男5 小时前
哈希表(c语言)
c语言·哈希算法·散列表
Edingbrugh.南空6 小时前
Aerospike与Redis深度对比:从架构到性能的全方位解析
java·开发语言·spring
CodeCraft Studio6 小时前
借助Aspose.HTML控件,在 Python 中将 HTML 转换为 Markdown
开发语言·python·html·markdown·aspose·html转markdown·asposel.html
QQ_4376643146 小时前
C++11 右值引用 Lambda 表达式
java·开发语言·c++
aramae6 小时前
大话数据结构之<队列>
c语言·开发语言·数据结构·算法