• 问题说明
  • 算法分析
  • 代码实现
  • 测试结果

问题说明

判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。

算法分析

例如: 12321 就是一个回文数
我们先考虑:①符数不能是回文数 例如:-121 倒序之后是121- 不符合
②10的整数倍不能是回文数 例如 10 100 1000 等
那么我们接下来先考虑一下如何解决这个问题:
我们可以把数字保存为字符串然后判断回文,但是这样的效率肯定是不高的,因为已经给了是数组,如果用字符串判断的话会用到更多额外的空间和时间。那么比较好的方法就是直接在这个数上进行操作。
我们创建一个新的变量保存倒叙之后的数字。
例如: int num = 12321;
只要我们一个num1 来保存num倒序之后的数,然后直接判断num1和num是否相等就好了。但是这样会带来一个很严重的问题就是越界,例如int类型的数字,在倒叙之后大于int类型的最大值,那就出现了溢出。所以这个方法是有缺陷的。
但是我们再思考一下,判断回文数的时候是不是可以这样 例如1221 只要我把后面一半的数字取出来倒序,然后和前面的数字进行比较是否相等就可以直接判断是否是回文数了,这样的话处理的数字的个数就是整个数数字的一半,也不会出现溢出。
现在的问题是,我们如何知道反转数字的位数已经达到原始数字位数的一半?
我们将原始数字除以 10,然后给反转后的数字乘上 10,所以,当原始数字小于反转后的数字时,就意味着我们已经处理了一半位数的数字。
还有一个问题就是,如果是数字个数是奇数的时候如何满足呢?例如:12321
我们在取到后两位变成12之后 原始数字就变成了123 我们只需要把这个数字除以10的操作放在一个合适的位置就可以把123变成12然后进行比较。我们在代码中详细说明。

那么整个问题已经解决,接下来我们编写代码进行测试:

代码实现

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#define FALSE   0
#define  TRUE   1
int IsPalindrome(x)
//把负数、能被10整除的数全部排除掉
{if (x < 0 || (x % 10 == 0 && x != 0)) {return FALSE;}int revertedNumber = 0;while (x > revertedNumber) {revertedNumber = revertedNumber * 10 + x % 10;x /= 10;}// 当数字长度为奇数时,我们可以通过 revertedNumber/10 去除处于中位的数字。// 例如,当输入为 12321 时,在 while 循环的末尾我们可以得到 x = 12,revertedNumber = 123,return x == revertedNumber || x == revertedNumber / 10;// 由于处于中位的数字不影响回文(它总是与自己相等),所以我们可以简单地将其去除。
}int main()
{int num;printf("intput number:");scanf("%d", &num);if (IsPalindrome(num)){printf("%d is Palindrome",num);}else{printf("%d  is not  Palindrome", num);;}return 0;
}

测试结果

最高效的回文数(C语言实现)相关推荐

  1. P1015 [NOIP1999 普及组] 回文数 C语言实现

    最近在做洛谷的一道回文数的题目时卡住了,但由于笔者只学习了C语言,于是想找一篇C语言写的博客学习一下.但无奈的是大多为C++或Python等语言,而且注释太少,用C++写的有的博客全局变量使用的太多, ...

  2. 10000内的回文数c语言,回文数

    "回文"是指正读反读都能读通的句子,它是古今中外都有的一种修辞方式和文字游戏,如"我为人人,人人为我"等.在数学中也有这样一类数字有这样的特征,成为回文数(pa ...

  3. mn之间的回文数c语言,c语言描述回文数的三种算法

    题目描述 注意:(这些回文数都没有前导0) 1位的回文数有0,1,2,3,4,5,6,7,8,9 共10个: 2位的回文数有11,22,33,44,55,66,77,88,99 共9个: * 请问:n ...

  4. 用c语言求五位回文数,C语言求回文数(详解版)

    问题描述 打印所有不超过n(取n<256)的其平方具有对称性质的数(也称回文数). 问题分析 对于要判定的数n计算出其平方后(存于a),按照"回文数"的定义要将最高位与最低位 ...

  5. 用c语言编程判断一个数是否为回文数,C语言判断一个数是不是回文数

    所谓回文数,就是说一个数字从左边读和从右边读的结果是一模一样的,例如12321.判断给出的整数是否是回文数:若是,则输出该整数各位数字之和:否则输出该数不是一个回文数. 原理大致为:任何一个数除以10 ...

  6. 五位数回文数c语言程序,五位数的回文数有多少个

    2018-12-16 数学中有哪些回文数? 简介折叠编辑本段回文数是指一个像16461这样"对称"的数,即:将这个数的数字按相反的顺序重新排列后,所得到的数和原来的数一样.这里,& ...

  7. c语言编写函数求回文数,C语言求回文数(详解版)

    问题描述 打印所有不超过n(取n<256)的其平方具有对称性质的数(也称回文数). 问题分析 对于要判定的数n计算出其平方后(存于a),按照"回文数"的定义要将最高位与最低位 ...

  8. 回文数c语言北理,2019届高考数学(北师大版理)大一轮复习配套练习:第十章 计数原理 第1讲 分类加法计数原理与分步乘法计数原理 .doc...

    2019届高考数学(北师大版理)大一轮复习配套练习:第十章 计数原理 第1讲 分类加法计数原理与分步乘法计数原理 .doc 第1讲分类加法计数原理与分步乘法计数原理一.选择题1.从集合0,1,2,3, ...

  9. 回文数c语言北理,2020年高考数学一轮复习课时分层训练62分类加法计数原理与分步乘法计数原理理北师大版4212.pdf-资源下载在线文库www.lddoc.cn...

    2020年高考数学一轮复习课时分层训练62分类加法计数原理与分步乘法计数原理理北师大版_4212.pdf 课时分层训练课时分层训练 六十二六十二 分类加法计数原理与分步乘法计数原理分类加法计数原理与分 ...

最新文章

  1. 浅析网站过度优化的成因应如何规避?
  2. 为什么全网 都在说 iOS 开发不行了 ?
  3. 分布式文件系统研究-fastDFS安装及配置文件说明
  4. ffmpeg的新东东:AVFilter
  5. 实战经验:从内存故障到CPU过高诊断-直播预告
  6. c++ 链表_剑指offer系列——52. 两个链表的第一个公共结点
  7. C++安全方向:(三)课前导学:密码学核心开发技术
  8. 动态编译和静态编译及Java执行
  9. TF-IDF来源及理论推导 熵推导出
  10. 零基础新手应该如何学习平面设计
  11. 湘源控规计算土石方流程
  12. MATLAB数据类型结构
  13. 计算机软件购销合同模版,软件销售合同范本
  14. 前路钉板系统在重建胸腰段稳定性中应用 [已发表]
  15. 消灭害虫V1.0 | EliminatePests V1.0
  16. 公司内网限制qq微信登陆--解决办法
  17. 3d vision可以卸载吗_3D Vision是什么
  18. 泰坦尼克号幸存者预测所用函数
  19. 36氪:超级表格想把企业协作做得“轻”一点
  20. MapReduce系列之MapReduce的输出

热门文章

  1. 初等数论--同余--WILSON定理
  2. python网络编程—Socket
  3. [hypervisor]-ARMV8的hypervisor技术介绍–InProgress
  4. 基于Warshall算法的连通图及欧拉图判定方法
  5. (52)系统调用阶段测试——基于 SSDT HOOK 的 FindWindowA 监视器
  6. 2020-10-25(动态调试SMC代码)
  7. NCTF2019 -- PWN部分writeup
  8. 【Nginx】Auth 认证
  9. 16、IN和NOT IN用法详解
  10. 25、Sql语句执行顺序