最高效的回文数(C语言实现)
- 問題說明
- 算法分析
- 代碼實現
- 測試結果
問題說明
判斷一個整數是否是回文數?;匚臄凳侵刚?#xff08;從左向右)和倒序(從右向左)讀都是一樣的整數。
算法分析
例如: 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语言实现)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 输出整数的位数、按位输出(两种)以及逆序
- 下一篇: 64匹马8个跑道需要多少轮才能挑选出最快