分治法實現大數相乘 C 實現

2021-09-03 10:25:14 字數 2448 閱讀 8133

分治法的思路一般的演算法教科書上都有,大數相乘也經常用來作為練習分治思想的很好的例子。

具體如下:

雖然上面的原理是對應2進製的,但是對於10進製也同樣可行。

用c#實現,盡可能的利用c#的特性。本例中,只要拆分的數字小於9位數,就可以直接相乘計算,保證不會溢位。

在程式設計中,還需要用的加法和減法,也要通過字串模擬實現。

最終的乘法運算,依賴遞迴思想得以實現。

本文的**還有一些可以優化的地方,比如對於不使用字串而是全部使用陣列,可能會更快點。

**如下:

namespace bigintmultiply

//字串模擬乘法操作

static string multiply(string x, string y)

else if ((x.startswith("-") && !y.startswith("-")) || (!x.startswith("-") && y.startswith("-")))

//如果長度都小於9,直接相乘,返回就行了。

if (x.length <= 9 && y.length <= 9)

//公式裡的abcd

string a, b, c, d;

if (x.length <= 9)

else

if (y.length <= 9)

else

int n = x.length >= y.length ? x.length : y.length;

string t1, t2, t3;

//遞迴呼叫,根據公式計算出值。

string ac = multiply(a, c);

string bd = multiply(b, d);

t1 = multiply(subtract(a, b), subtract(d, c));

t2 = add(add(t1, ac), bd);

t3 = add(add(power10(ac, n), power10(t2, n / 2)), bd).trimstart('0');

if (t3 == "") return "0";

return negative + t3;

}//字串模擬加法操作

static string add(string x, string y)

else if (!x.startswith("-") && y.startswith("-"))

else if (x.startswith("-") && y.startswith("-"))

if (x.length > y.length)

else

int sum = new int[x.length + 1];

for (int i = x.length - 1; i >= 0; i--)

else

}string returnvalue = string.concat(sum);

if (sum[0] == 1)

else

}//字串模擬減法操作

static string subtract(string x, string y)

//if (y.startswith("-"))

////x是正數,y也是正數

int flag = checkbigger(x, y);

if (flag == 0)

else if (flag == -1)

//保證了x>=y

y = y.padleft(x.length, '0');//y補0與x對齊

int difference = new int[x.length];

for (int i = x.length - 1; i >= 0; i--)

difference[i] = tmpdifference;

}stringbuilder returnvalue = new stringbuilder(string.concat(difference).trimstart('0'));

}if (flag == -1)

return returnvalue.tostring();

}//比較大小

static int checkbigger(string x, string y)

else if (x.length < y.length)

else

else if (int.parse(x[i].tostring()) < int.parse(y[i].tostring()))

continue;

}return 0;}}

//模擬移位

static string power10(string num, int n)}}

測試了一下1234567890.........1234567890(260個1234567890,2600位)的平方,得出的結果如下:

可以從得到驗證。

分治法 大數相乘(演算法001)

兩個長為n bit的數x和y相乘。我們可以將數分為長為n 2 bit的前後兩部分,分別相乘。x y 2n 2xl xr 2n 2yl yr 2nxlyl 2n 2 xlyr xryl xryr 2nxlyl 2n 2 xl xr yl yr xlyl xryr xryr 公式如上,xl,yl,xr,...

大數相乘(C語言,分治演算法)

問題 由於程式語言提供的基本數值資料型別表示的數值範圍有限,不能滿足較大規模的高精度數值計算,因此需要利用其他方法實現高精度數值的計算,於是產生了大數運算。大數運算主要有加 減 乘三種方法。下面就是用分治演算法解決 大數相乘 問題。分治演算法解題的一般步驟 include using namespa...

大數相乘的演算法實現(C )

在網上看到乙個面試題,要求計算 100的階乘,即 100 不能使用浮點數。我們知道,這種運算在數學中是很容易使用公式來描述,但是在計算機中,由於資料型別 記憶體容量的限制,無法使用整型數 即使是 64位整數 計算這麼大的結果,只能使用其他方法計算。using system using system....