最高效的回文數(C語言實現)

2021-09-29 19:30:46 字數 1442 閱讀 7851

判斷乙個整數是否是回文數。回文數是指正序(從左向右)和倒序(從右向左)讀都是一樣的整數。

例如: 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

#define false 0

#define true 1

intispalindrome

(x)//把負數、能被10整除的數全部排除掉

int revertednumber =0;

while

(x > revertednumber)

// 當數字長度為奇數時,我們可以通過 revertednumber/10 去除處於中位的數字。

// 例如,當輸入為 12321 時,在 while 迴圈的末尾我們可以得到 x = 12,revertednumber = 123,

return x == revertednumber || x == revertednumber /10;

// 由於處於中位的數字不影響回文(它總是與自己相等),所以我們可以簡單地將其去除。

}int

main()

else

return0;

}

c語言實現回文數

題目 輸入乙個數,判斷這個數是否是回文數,是的話返回true,否返回false。回文數是指正序 從左向右 和倒序 從右向左 讀都是一樣的整數。輸入示例1 輸入 121輸出 true輸入示例2 輸入 121 輸出 false 解釋 從左向右讀,為 121 從右向左讀,為 121 因此它不是乙個回文數思...

藍橋杯 特殊回文數 c 語言實現

問題描述 123321是乙個非常特殊的數,它從左邊讀和從右邊讀是一樣的。輸入乙個正整數n,程式設計求所有這樣的五位和六位十進位制數,滿足各位數字之和等於n 輸入格式 輸入一行,包含乙個正整數n。輸出格式 按從小到大的順序輸出滿足條件的整數,每個整數佔一行。樣例輸入 52樣例輸出 899998 989...

C語言 回文數

回文數是一種正著讀反著讀都一樣的數,比如12321,asdsa 基本程式思路 建立兩個指標指向字串,使乙個字元指向該字串結束標記前乙個字元,另乙個指標指向開頭,然後判斷前後兩個指標的值是否相等,相等就比第二個第三個等等,不相等就直接break,因為它不是回文數。程式 如下 include intma...