求能分解為兩個三位數乘積的最大回文數

2021-08-30 06:10:40 字數 1470 閱讀 9642

注:所謂回文數就是正序和倒序相等的數字,好比9009的倒序還是9009

在題目中,我們已經知道了這個回文數是2個三位數的乘積, 那我們可以很輕鬆的寫出**。

#定義數字倒轉函式

def reverse(num):

strnum = str(num)[::-1]

return int(strnum)

max = none

for a in range(100, 1000):

for b in range(100, 1000):

rs = a * b

if rs == reverse(rs) and rs > max:

max = rs

print max

用這個方法我們是可以得到結果,但是效率好像不盡人意。 現在我們來分析下還可以怎麼優化我們的程式:

1. 上述程式中,a和b的乘積會反覆出現嗎? 比如當a=132,b=528同a=528, b=132的結果是一樣的,那我們通過設定b小於或大於a,是不是可以避免這樣的情況。

2. 題目要求我們找的最大的乘積, 那2個三位數肯定也是很大, 我們用從大到小查詢,是不是會比從小到大查詢快很多呢,當我們找到的後乙個回文數沒有前乙個大,那程式就可以終止了。

3. 兩個三位數的乘積肯定是乙個六位數, 而這個六位回文數數p我們可以用xyzzyx的形式表示,那我們可以得到下面的公式:

p = 100000x + 10000y + 1000z + 100z + 10y + x

p = 100001x + 10010y + 1100z

p = 11(9091x + 910y + 100z)

在這個公式中我們發現回文數是11的倍數,而11是質數,這也就表示不是a可以被11整除,就是b可以被11整除。那我們合理的利用11作為遞進數是不是要比原來的1更效率呢?

通過上述分析,我們來重寫**:

#定義數字倒轉函式

def reverse(num):

strnum = str(num)[::-1]

return int(strnum)

max = none

for a in range(999, 99, -1):

db = -1

start = 999

if a % 11 != 0:

start = 990

db = -11

for b in range(start, 99, db):

rs = a * b

if rs == reverse(rs):

if rs > max:

max = rs

else:

break

print max

經測試,原來的程式需要810000次迴圈,而優化後的程式只需要71533次迴圈, 效能提高了10倍多。

求A B的最後三位數

求a b的最後三位數 首先需要知道乙個公式 a b c a c b c c為什麼需要這個公式?a b的結果可能出現溢位,所以取模之後就不會了 快速冪解法 2.1 首先將冪指數用二進位制表示,例如 313 31101 38 34 31。所以最後的結果就是將二 進製中為1的係數冪乘起來即可 2.2 第二...

練習,求滿足條件的三位數

特殊三位數 請輸出滿足條件n a b c 的所有三位數 n,其中,a b c分別是 n的百 十 個位數。要求用自定義函式實現求階乘。include using namespace std 自定義函式的原型 即函式宣告 int fac int int main int s,a,b,c,x 100 wh...

程式設計練習(三位數運算最大的結果)

題目 小s學會了加法和乘法運算和他們的優先順序,還知道括號裡的算式要優先計算,現在給小s3個數,a,b,c,小s想通過自己的知識得到這三個數運算可得到的最大值。要求 輸入 第一行 a,b,c 輸出最大結果。思路 設計乙個max a,b 返回a b,a b中較大的那個數。通過的 include inc...