大整數乘法運算


乘法的計算比加法要麻煩,主要有兩個思路:

  1. 模擬手算
  2. 先不管所有進位計算,最后統一處理進位

乘法手算的步驟:

還是用string來表示數字,乘積的位數最大為兩個相乘數的位數和,所以開始就可給定結果的位數。為了節省內存,我們用了一個小技巧:用result來表示每次相乘的和,這樣就不需額外聲明保存每位乘積的變量了。

具體代碼:

std::string Mul(std::string a, std::string b)
{
	std::string result(a.length() + b.length(), '0');  //兩個數相乘,結果的位數不會超過它們的位數之和。

	for (int i = b.length() - 1; i >= 0; --i)
	{
		int mul_carry = 0, add_carry = 0;  //記錄乘法時的進位,加法時的進位
		for (int j = a.length() - 1; j >= 0; --j)
		{
			int temp = (b[i] - '0') * (a[j] - '0') + mul_carry;  //每位相乘的值
			mul_carry = temp / 10;  //記錄進位
			temp %= 10;  //進位后的值

			int temp2 = result[i + j + 1] - '0' + temp + add_carry;
			result[i + j + 1] = temp2 % 10 + 48;  //設置相應位上的值和原本位上值相加后的值。
			add_carry = temp2 / 10;  //記錄進位
		}
		result[i] += mul_carry + add_carry;
	}

	//如果首位是0,則從第二位開始輸出
	if (result[0] == '0')
		result = result.substr(1, result.length());

	return result;
}

現在來看看它的威力:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM