C语言初阶习题(6指针)【21】打印水仙花数

1. 题目描述

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

2. 思路

一开始脑袋都成浆糊了。就是我需要判断这个数字是几位数,我需要求出这个数的每一位,当时混在一起考虑根本然不清。然后就想到了分开,写一个函数单求这个数字是几位数的,单独写一个函数求这个数字的n次方。单独写一个函数来判断它是否是水仙花数。

  1. 求一个数字有几位数
    思路:小于9就是1位数,大于9开始就要计算,所以我们的条件是是否大于9,因为我们需要处理的情况是大于9的,小于9的我们默认就是1
c 复制代码
int sizeNum(int n)
{
	int size = 1;
	while (n > 9)
	{
		n = n / 10;
		size++;
	}
	return size;
}
  1. 求一个数字的次方
    思路:这个也比较简单,需要传入两个参数,我们要求次方的数字,和要求的次方数,for循环,要求几次,乘几次
c 复制代码
int powNum(int n,int m)
{
	int i = 0;
	if (n == 0)
	{
		return 0;
	}
	int a = 1;

	for(int i = 0;i<m;i++)
	{
		a *= n;

	}
	return a;
}
  1. 求水仙花数,这个函数就用到了上面俩函数
    思路:先调用求出我们是几位数,函数专心考虑取出我们的每一位,然后调用求次方相加
c 复制代码
int flawerNum(int n)
{
	int sum = 0;
	int num = n;   //这里我原本是没有另外创建临时变量来接收我们传入的参数,
	//然后在if判断的时候就有问题了,我们最后还需要使用这个n的值,所以应该再创建一个局部变量
	int size = sizeNum(num);


	int i = 0;
	for (i = 0; i < size; i++)
	{
		sum += powNum(num % 10, size);
		num = num / 10;
	}
	if (n == sum)
	{
		return 1;
	}
	else
	{
		return 0;
	}

}

3. 代码实现

求0-100000的水仙花数,我们for循环,调用即可。

c 复制代码
//求出0~100000之间的所有"水仙花数"并输出。
//"水仙花数"是指一个n位数,其各位数字的n次方之和确好等于该数本身,如:153=1 ^ 3+5 ^ 3+3 ^ 3,则153是一个"水仙花数"。
#include<stdio.h>


int sizeNum(int n)
{
	int size = 1;
	while (n > 9)
	{
		n = n / 10;
		size++;
	}
	return size;
}

int powNum(int n,int m)
{
	int i = 0;
	if (n == 0)
	{
		return 0;
	}
	int a = 1;

	for(int i = 0;i<m;i++)
	{
		a *= n;

	}
	return a;
}


int flawerNum(int n)
{
	int sum = 0;
	int num = n;   //这里我原本是没有另外创建临时变量来接收我们传入的参数,
	//然后在if判断的时候就有问题了,我们最后还需要使用这个n的值,所以应该再创建一个局部变量
	int size = sizeNum(num);


	int i = 0;
	for (i = 0; i < size; i++)
	{
		sum += powNum(num % 10, size);
		num = num / 10;
	}
	if (n == sum)
	{
		return 1;
	}
	else
	{
		return 0;
	}

}

int main ()
{

	//printf("%d ", powNum(5, 3));

	
	//printf("%d ", flawerNum(153));
	int num = 0;
	
	for (num = 0;num < 100000; num++)
	{
		if (flawerNum(num)==1)
		{
			printf("%d ",num);
		}
		
	}
	return 0;
}
相关推荐
气概16 分钟前
QT集成basler相机
开发语言·数码相机·qt
苦瓜汤补钙25 分钟前
Oracle JDK8 环境配置-Win11
开发语言·数据库·笔记·oracle
overmind27 分钟前
oeasy Python 102 集合_运算_交集_并集_差集_对称差集
开发语言·python
研☆香1 小时前
JavaScript 绘制简单不规则图形:三角形与五角星实战教程
开发语言·javascript·ecmascript
数聚天成DeepSData1 小时前
企业知识库 RAG 数据准备与文档清洗:Dify、RAGFlow、扣子选型指南
开发语言·人工智能·机器学习·自然语言处理·sentinel·cocos2d
我是唐青枫1 小时前
Java SLF4J 实战指南:从日志门面到 Logback、MDC 和链路追踪
java·开发语言·logback
aramae1 小时前
C++11:现代C++的里程碑
c语言·开发语言·c++·windows·git·后端
weixin_446729162 小时前
java实现发送邮件
java·开发语言
无相求码2 小时前
为什么你的第二个 scanf 还没输入就直接跳过了?C语言输入缓冲区陷阱
c语言·后端
米尔的可达鸭2 小时前
深入操作系统 Socket 底层:EPOLLOUT 可写事件管理 + 非阻塞异步
开发语言·网络·数据结构·经验分享·websocket·网络协议