分治法的思路一般的演算法教科書上都有,大數相乘也經常用來作為練習分治思想的很好的例子。
具體如下:
雖然上面的原理是對應2進製的,但是對於10進製也同樣可行。
用c#實現,盡可能的利用c#的特性。本例中,只要拆分的數字小於9位數,就可以直接相乘計算,保證不會溢位。
在程式設計中,還需要用的加法和減法,也要通過字串模擬實現。
最終的乘法運算,依賴遞迴思想得以實現。
本文的**還有一些可以優化的地方,比如對於不使用字串而是全部使用陣列,可能會更快點。
**如下:
namespace bigintmultiply測試了一下1234567890.........1234567890(260個1234567890,2600位)的平方,得出的結果如下://字串模擬乘法操作
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)}}
可以從得到驗證。
分治法 大數相乘(演算法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....