正整數n的加法組合的最大乘積的超快演算法

2021-08-30 05:45:21 字數 3148 閱讀 6874

[url]

題目:給定乙個正整數n,則在n所有的分解式中,求因子乘積最大的乙個分解及此乘積。

n=5時,有如下分解式:

5=55=4+1

5=3+2

5=3+1+1

5=2+2+1

5=2+1+1+1

5=1+1+1+1+1

在這些分解式中,3*2=6最大,這就是所要求的結果。

若n = 12,最大為3*3*3*3 = 81。

解法:這一題冒失需要窮盡所有的分解式,其實不然,通過分析資料可得出如下假設:

對任意乙個正整數x>3,有i=x/3,j=x%3, 設s為分解式乘積最大的數

當 j=0 時 s=3的i次方

當 j=1 時 s=3的(i-1)次方*4

當 j=2 時 s=3的i次方*2

證明:首先我們證明將x分為3和2的組合得到的s最大

1)首先證明當310,且x=a[0]+...a[k]時s最大,且a[i]不等於2和3

若a[i]>10,假設a[i]=10*l+m (m<10),明顯可知 若將a[i]分解為 l個10相加再加上m 得到的乘積為(10的l次方*m)不小於 a[i]。所有a中不可能存在大於10的數

若0=s

由此可以證明 將整數x 分解為2,3的組合 得到的s最大

又因為3+3=2+2=2

3*3=9 > 2*2*2=8

所有若出現3個2就應該轉換為兩個3

**如下:

public static long calculate(long value) 

}return result;

}

執行結果:

[table]

|n=1,result=0|

|n=2,result=1|

|n=3,result=3|

|n=4,result=4|

|n=5,result=6|

|n=6,result=9|

|n=7,result=12|

|n=8,result=18|

|n=9,result=27|

|n=10,result=36|

|n=11,result=54|

|n=12,result=81|

|n=13,result=108|

|n=14,result=162|

|n=15,result=243|

|n=16,result=324|

|n=17,result=486|

|n=18,result=729|

|n=19,result=972|

|n=20,result=1458|

|n=21,result=2187|

|n=22,result=2916|

|n=23,result=4374|

|n=24,result=6561|

|n=25,result=8748|

|n=26,result=13122|

|n=27,result=19683|

|n=28,result=26244|

|n=29,result=39366|

|n=30,result=59049|

|n=31,result=78732|

|n=32,result=118098|

|n=33,result=177147|

|n=34,result=236196|

|n=35,result=354294|

|n=36,result=531441|

|n=37,result=708588|

|n=38,result=1062882|

|n=39,result=1594323|

|n=40,result=2125764|

|n=41,result=3188646|

|n=42,result=4782969|

|n=43,result=6377292|

|n=44,result=9565938|

|n=45,result=14348907|

|n=46,result=19131876|

|n=47,result=28697814|

|n=48,result=43046721|

|n=49,result=57395628|

|n=50,result=86093442|

|n=51,result=129140163|

|n=52,result=172186884|

|n=53,result=258280326|

|n=54,result=387420489|

|n=55,result=516560652|

|n=56,result=774840978|

|n=57,result=1162261467|

|n=58,result=1549681956|

|n=59,result=2324522934|

|n=60,result=3486784401|

|n=61,result=4649045868|

|n=62,result=6973568802|

|n=63,result=10460353203|

|n=64,result=13947137604|

|n=65,result=20920706406|

|n=66,result=31381059609|

|n=67,result=41841412812|

|n=68,result=62762119218|

|n=69,result=94143178827|

|n=70,result=125524238436|

|n=71,result=188286357654|

|n=72,result=282429536481|

|n=73,result=376572715308|

|n=74,result=564859072962|

|n=75,result=847288609443|

|n=76,result=1129718145924|

|n=77,result=1694577218886|

|n=78,result=2541865828329|

|n=79,result=3389154437772|

[/table]

超長正整數的加法

問題描述 編寫程式實現兩個超長正整數 每個最長80位數字 的加法運算。輸入形式 從鍵盤讀入兩個整數,要考慮輸入高位可能為0的情況 如00083 第一行是超長正整數a 第二行是超長正整數b 輸出形式 1.用字串輸入兩個超長整數,分別存放在兩個字串中,每一位對應乙個字串中的字元。2.以較短的超長整數為基...

超長正整數的加法

請設計乙個演算法來完成兩個超長正整數的加法。問題分析與演算法設計 首先要設計一種資料結構來表示乙個超長的正整數,然後才能夠設計演算法。首先我們採用乙個帶有表頭結點的環形鏈來表示乙個非負的超大整數,如果從低位開始為每 個數字編號,則第一位到第四位 第五位到第八位.的每四位組成的數字,依次放在鍊錶的第乙...

子陣列的最大乘積

子陣列的最大乘積 給定乙個長度為 n的整數陣列,只允許用乘法,不能用除法,計算任意 n 1 個數的組合乘積中最大的一組,並寫出演算法的時間複雜度。我們把所有可能的 n 1 個數的組合找出來,分別計算它們的乘積,並比 較大小。由於總共有n個 n 1 個數的組合,總的時間複雜度為o n2 但顯然這不是最...