由於網上大部分用分治演算法實現的大整數相乘程式,其輸入乘數竟然設定為int值,實現了分治思想,但實在不能稱其為大整數。本文實現了用字串儲存乘數,並且輸出正確結果。由於演算法未經過大量資料測試,可能還存在問題,歡迎指教討論,求輕踩。。。
演算法分析:
下面的函式均為分治函式設定,因為分治後得到的m1,m2,m3如果足夠大,就有必要解決他們之間的加減乘等問題,即是字串的大數相加、相減問題,而由於字串可能為負數,所以進行運算之前還要加以判斷。
c++**:
#include #include #include using namespace std;
string cut(string s)
string add(string a, string b)
while (t != 0)
reverse(s.begin(), s.end());
return s;
}string sub(string a, string b)
a[t]--;
} s += (num+'0');
count++;
} s += a.substr(count, a.length());
count = a.length()-1;
while (s[count] == '0' && count != 0) count--;
s = s.substr(0,count+1);
reverse(s.begin(), s.end());
return s;
}string ten_n(string s, int n)
bool compare(string a, string b)
return 1; }}
string expand_first(string a, string b, string c)
string expand_second(string a, string b, string c)
string add_three_number(string a, string b, string c)
string mult(string x, string y, int n)
if (y[0] == '-')
for (int i = 0; i < n; i++) //由於一開始輸入可能會補0,加上此判斷
if (x[i] != '0')
for (int i = 0; i < n; i++)
if (y[i] != '0')
if (note != 2)
return "0";
else if (n == 1)
reverse(s.begin(), s.end());
if (flag == 1) return s;
else
} else }}
int main()
while (y_length < n)
cout << mult(x,y,n) << endl;
} return 0;
}
演算法 字串大整數相乘
題目描述 給定兩個以字串形式儲存的大整數,要求以字串形式輸出相乘後的結果。思路 模擬計算乘法時列豎式的過程,對於兩個字串s1和s2,讓s2的每一位和s1整體相乘,求得一組中間值,然後對中間值做移位操作,最後將移位後的所有中間值相加即可求得最終結果。問題的關鍵在於實現兩個函式,用於計算兩個字串相加以及...
和整數相乘 分治演算法解大整數相乘問題
有兩個n位大整數,它們數值之分大,如。現在要計算它們的乘積。逐位相乘 錯位相加,時間複雜度。效率太低。將n位的二進位制整數x和y各分為2段,每段的長為n 2位 為簡單起見,假設n是2的冪 此處整數用2進製表示。複雜度分析 x乘y,一共有4次位大整數相乘,3次加法,2次移位。這種分治的複雜度與傳統計算...
分治法 大整數相乘
大整數相乘 a b兩個整數,a有n位 123456 n b有m位 123456 m 一般的思路是像最初學習乘法時一樣逐位相乘後相加,但是這樣做演算法的複雜度過高,但這仍然是解題的基本思想。既然提到分治,那麼如何分,怎麼治?能夠找到乙個大問題劃分為小問題方法的重要技巧是能夠看到大問題的規模和所謂規模的...