大數n次方演算法筆記

2021-05-23 07:23:21 字數 1871 閱讀 1274

問題是解決 a^n 的問題。

最簡單的想法是使用迴圈:

long result = 1;

for (i = 1; i <= n; i++)

return result;

但是,如果a與n足夠大,就有可能在迴圈的某一步時得到過大的result,

超出現有變數儲存範圍。

所以,需要有其他方法對應a^n 的問題。

具體演算法***的文章已經給出了。

本人自己的思路是:

1.  求解問題的關鍵是解決迴圈的某一步, result 特別大時,

result = result * a; 的計算問題,如果這一問題解決,

整個問題就迎刃而解了。

2.  設result一共有x位,a一共有y位。

設result各位的值為:r1,r2,...rx;a各位的值為:a1,a2,...,ay。

則result * a = [rx * 10^(x - 1) + ...+ r2 * 10^(2 - 1) + r1 * 10^(1 - 1) ]

* [ay * 10^(y - 1) + ...+ a2 * 10^(2 - 1) + a1 * 10^(1 - 1) ]

然後呢?處理好各項之間的乘積,注意每項所屬位數,

如 ri * 10^(i - 1) * aj * 10^(j - 1) ,為result的第i位與a的第j位的乘積,

乘積的有效值為 (ri * aj),(ri * aj)這個值應該屬於最終結果 result * a的第 (i + j - 1)位。

當然,還要注意,如果(ri * aj) 的結果大於9,則應進製。

如,(ri * aj) = 27,則第 (i + j - 1)位應為7, 並向第(i + j)位進2。

到此,其實問題已經解決。

3.  下面舉個例子(為了簡單,取了很簡單的數)

設result = 1234, a = 123

將1,2,3,4分別乘以1,2,3,並注意乘積的位數,得到:

1 * 1 = 1 第 4 + 3 - 1 = 6 位。

1 * 2 = 2 第 4 + 2 - 1 = 5 位。

1 * 3 = 3 第 4 + 1 - 1 = 4 位。

2 * 1 = 2 第 3 + 3 - 1 = 5 位。

2 * 2 = 4 第 3 + 2 - 1 = 4 位。

2 * 3 = 6 第 3 + 1 - 1 = 3 位。

3 * 1 = 3 第 2 + 3 - 1 = 4 位。

3 * 2 = 6 第 2 + 2 - 1 = 3 位。

3 * 3 = 9 第 2 + 1 - 1 = 2 位。

4 * 1 = 4 第 1 + 3 - 1 = 3 位。

4 * 2 = 8 第 1 + 2 - 1 = 2 位。

4 * 3 = 12 第 1 + 1 - 1 = 1 位。

此時,結果的第1位只有乙個解:12,但是12 > 9,所以第1位為2,並向第2位進製1。

第2位有2個解:8,9,並考慮第1位的進製,得,第2位 = 8 + 9 + 1 = 18,保留8,並向第3位進製1。

第3位有3個解:4,6,6, 並考慮第2位的進製,得,第3位 = 4 + 6 + 6 + 1 = 17,保留7,並向第4位進製1。

第4位有3個解:3,4,3, 並考慮第3位的進製,得,第4位 = 3 + 4 + 3 + 1 = 11,保留1,並向第5位進製1。

第5位有2個解:2,2, 並考慮第4位的進製,得,第5位 = 2 + 2 + 1 = 5,保留5,無進製。

第6位有1個解:1,保留1,無進製。

所以,最終結果為:151782 = 1234 * 123

求n次方的演算法

今天看交大的資料結構書,看到了乙個計算n次方的好演算法,它的時間複雜度只有logn,一般我們可能用迴圈,時間複雜度是o n 當這個演算法只有o logn 確切點說是o 6logn 演算法貼來.真高興 intpower intx,intn m n inty 1 while t 1 returny 原理...

a的n次方的高效演算法

a b的高效演算法 lz之所以要貼上這個演算法,是因為lz的乙個朋友用這個小演算法考過lz,我當時想到了這個演算法,思想有了,但是沒有實現出來,但是我朋友用遞迴的方法寫的,但是遞迴的lz的理解不是很深刻,所以這裡用自己理解的非遞迴的形式寫出來。include int pow int a,int b ...

筆算開n次方

在j2me中,有時會用到開方運算,但是midp1.0中沒有提供該功能。這裡使用筆算開方的方式,實現了開任意數的n次方。這裡使用了long作為運算的臨時變數型別,在數值較大或者保留位數太多的時候,會出現因為long數值溢位而導致的錯誤。public class extract else string ...