C语言实例:求水仙花数(阿姆斯壮数)和回文数(附带求一串数字的位数方法和每一位数字的计算方法)

本文主要是介绍C语言实例:求水仙花数(阿姆斯壮数)和回文数(附带求一串数字的位数方法和每一位数字的计算方法),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

🐱一.水仙花(阿姆斯壮数)

    😼    1.水仙花数定义

    😸    2.代码实现

🐯二.回文数


    🐅    1.回文数定义

    🐆    2.代码实现

一.水仙花数(阿姆斯壮数)

1.水仙花数定义

2.代码实现

虽然定义上水仙花数是一个三位数,我们这里要说的代码是一个能求任意范围内的水仙花数的代码。

根据定义,我们知道水仙花数每个位上的数字的该数位数的次幂和等于该数,那么要求水仙花数,就要得先知道该数是几位数。

那怎样求得位数呢?

我们知道求个位上的数字只需拿该数%10就行了,然后再/10,就丢掉了个位,以此类推,很显然,这是一个循环结构,这时我们定义一个记录位数变化的变量n ,每次进入循环时就count++;那么问题来了,怎么控制循环的开始与结束?数字嘛,至少是一位数,而一位数的数字/10=0,因为0为假,非0为真,恰好可以利用这一点来控制循环,具体代码:

int main()
{int i = 0;int n, m;printf("请输入范围:>");scanf("%d %d", &n, &m);for(i=n;i<=m;i++){n = 1;    //初始值是1int tmp = i;    //使用i但不改变iint sum = 0;    //循环完一遍后使sum=0,判断下一次水仙花数while (tmp / 10 != 0)    //控制循环{n++;    //记录位数tmp = tmp / 10;}}return 0;
}

上面代码中的 int sum=0,不能丢,也不能定义成其他的数。位数知道了,接下来就是看每一位的位数幂次方之和是否等于 i 就行了。

可以在嵌套一个循环,定义一个变量并初始化 int sum=0; ,具体代码:

        int count = n;    //使用n但不改变nfor (tmp = i; count > 0; count--)    //求每位数n次幂加起来的和{sum = sum + pow(tmp % 10, n);    tmp = tmp / 10;}if (sum == i)    //判断水仙花数{printf("%d ", i);}

全部代码:

 二.回文数

1.回文数定义

2.代码实现

回文数正着读倒着读都一样,所以我们如果能判断第1个数字和最后1个数字相同,第2个数字和倒数第2个数字相同.......如果是位数是奇数的话,那中间的数字是不需要判断的,偶数的话,判断前半段和后半段对应的数字相同即可。

好的思路有了,就可以开始写代码了,首先判断位数,这在水仙花数的判断里已经详细讲过了,在这里就不赘述了,详情参照上文。

从思路中我们知道,要判断是否是回文数,需要使用到前面和后面的数字,但不能改变原来的数,所以我们得分别定义两个变量,之后也会用到位数,同理也不能改变位数,所以又需要一个变量,具体变量定义请看下图:

 

前半部分代码:

int main()
{int n, m;	//输入范围int i,j, count; //i产生n - m之间的数,count记录位数int tmp1, tmp2;	//tmp1使用前面的数,tmp2使用后面的数printf("请输入范围:>");scanf("%d %d", &n, &m);int flag = 0;for (i = n; i <= m; i++){count = 1;  //计算位数tmp1 = i;while (tmp1 / 10 != 0){count++;tmp1 = tmp1 / 10;}}return 0;
}

 最关键的部分我们用循环实现。

通过前面的分析我们发现其实不管位数是奇数还是偶数,最终只需要循环 位数的一半,循环一次比较一对数字,所以循环 count/2 次,同理又需要一个新变量来使用 count/2。

要比较一对数字,后面的数字的求法已经在上文提到了,即先%10,再/10;那前面的数字怎么求呢?

比如说123,怎么获取到1呢?

不难发现其实只需要拿123/100就行了,然后123%100得到了23,再拿23/10.......以此类推。

具体代码请看下图:

 红框里的都是值得注意的地方。

1红框在上文已经提到;

2红框:如果我们直接把 tmp1/(pow(10,j-1))写在 if 判断中,那最后得到的结果就是错误的;

3,5红框用来判断是不是回文数,如果是的话,那么 flag==count2; 因为如果是回文数的话,那么每一对数字的比较都会进如第1个 if 语句中,循环几次 flag 就等于几;

4红框:为什么这么写呢?直接写成 tmp1=tmp1%pow(10,j-1) 不行吗?

我们来看看 pow 函数的定义:

 可以看到 pow 函数的返回值类型是 double ,而%操作符两边的操作数必须是整数,所以才像4红框中那样写。

完整代码:

int main()
{int n, m;	int i,j, count; int tmp1, tmp2;	printf("请输入范围:>");scanf("%d %d", &n, &m);int flag = 0;for (i = n; i <= m; i++){count = 1; tmp1 = i;flag = 0;while (tmp1 / 10 != 0){count++;tmp1 = tmp1 / 10;}int a = count / 2;for (j=count,tmp1=i,tmp2=i; a > 0; j--,a--){int b1 = tmp1 / (pow(10, j - 1));if(b1==tmp2%10){flag++;int p1 = pow(10, j-1);tmp1 = tmp1 % p1;tmp2 = tmp2 / 10;}}if (flag == count / 2){printf("%d ", i);}}return 0;
}

一串数字的位数计算方法:

 每一位数字的计算方法:

1.从前先后:

先 除10的位数次方,然后取模10的位数次方。

下面是一个6位数的例子:

 2.从后向前:

先%10再/10。

例:

        😸本篇文章到此结束啦,如有错误或是意见,欢迎小伙伴们的提出。

        🐯谢谢你的阅读

这篇关于C语言实例:求水仙花数(阿姆斯壮数)和回文数(附带求一串数字的位数方法和每一位数字的计算方法)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/196964

相关文章

JavaScript中的reduce方法执行过程、使用场景及进阶用法

《JavaScript中的reduce方法执行过程、使用场景及进阶用法》:本文主要介绍JavaScript中的reduce方法执行过程、使用场景及进阶用法的相关资料,reduce是JavaScri... 目录1. 什么是reduce2. reduce语法2.1 语法2.2 参数说明3. reduce执行过程

C#中读取XML文件的四种常用方法

《C#中读取XML文件的四种常用方法》Xml是Internet环境中跨平台的,依赖于内容的技术,是当前处理结构化文档信息的有力工具,下面我们就来看看C#中读取XML文件的方法都有哪些吧... 目录XML简介格式C#读取XML文件方法使用XmlDocument使用XmlTextReader/XmlTextWr

python使用fastapi实现多语言国际化的操作指南

《python使用fastapi实现多语言国际化的操作指南》本文介绍了使用Python和FastAPI实现多语言国际化的操作指南,包括多语言架构技术栈、翻译管理、前端本地化、语言切换机制以及常见陷阱和... 目录多语言国际化实现指南项目多语言架构技术栈目录结构翻译工作流1. 翻译数据存储2. 翻译生成脚本

C++初始化数组的几种常见方法(简单易懂)

《C++初始化数组的几种常见方法(简单易懂)》本文介绍了C++中数组的初始化方法,包括一维数组和二维数组的初始化,以及用new动态初始化数组,在C++11及以上版本中,还提供了使用std::array... 目录1、初始化一维数组1.1、使用列表初始化(推荐方式)1.2、初始化部分列表1.3、使用std::

oracle DBMS_SQL.PARSE的使用方法和示例

《oracleDBMS_SQL.PARSE的使用方法和示例》DBMS_SQL是Oracle数据库中的一个强大包,用于动态构建和执行SQL语句,DBMS_SQL.PARSE过程解析SQL语句或PL/S... 目录语法示例注意事项DBMS_SQL 是 oracle 数据库中的一个强大包,它允许动态地构建和执行

前端原生js实现拖拽排课效果实例

《前端原生js实现拖拽排课效果实例》:本文主要介绍如何实现一个简单的课程表拖拽功能,通过HTML、CSS和JavaScript的配合,我们实现了课程项的拖拽、放置和显示功能,文中通过实例代码介绍的... 目录1. 效果展示2. 效果分析2.1 关键点2.2 实现方法3. 代码实现3.1 html部分3.2

Ubuntu固定虚拟机ip地址的方法教程

《Ubuntu固定虚拟机ip地址的方法教程》本文详细介绍了如何在Ubuntu虚拟机中固定IP地址,包括检查和编辑`/etc/apt/sources.list`文件、更新网络配置文件以及使用Networ... 1、由于虚拟机网络是桥接,所以ip地址会不停地变化,接下来我们就讲述ip如何固定 2、如果apt安

Go路由注册方法详解

《Go路由注册方法详解》Go语言中,http.NewServeMux()和http.HandleFunc()是两种不同的路由注册方式,前者创建独立的ServeMux实例,适合模块化和分层路由,灵活性高... 目录Go路由注册方法1. 路由注册的方式2. 路由器的独立性3. 灵活性4. 启动服务器的方式5.

在不同系统间迁移Python程序的方法与教程

《在不同系统间迁移Python程序的方法与教程》本文介绍了几种将Windows上编写的Python程序迁移到Linux服务器上的方法,包括使用虚拟环境和依赖冻结、容器化技术(如Docker)、使用An... 目录使用虚拟环境和依赖冻结1. 创建虚拟环境2. 冻结依赖使用容器化技术(如 docker)1. 创

Go语言中三种容器类型的数据结构详解

《Go语言中三种容器类型的数据结构详解》在Go语言中,有三种主要的容器类型用于存储和操作集合数据:本文主要介绍三者的使用与区别,感兴趣的小伙伴可以跟随小编一起学习一下... 目录基本概念1. 数组(Array)2. 切片(Slice)3. 映射(Map)对比总结注意事项基本概念在 Go 语言中,有三种主要