大數相乘的實現

        一般所說的大數即超出了系統所支持的最大類型的整形的表示範圍,對於這種大的數不能用整形類型來表示,只能通過string 類型來表示。對於兩個用string 類型來表示的大數,其乘法實現按兩個數相乘的一般法則來實現。返回類型也用string 類型來表示。

//兩個string 進行相加(按各位字符所對應的整數值)
string execadd(string s1, string s2){
	int len1 = s1.length() - 1;
	int len2 = s2.length() - 1;

	string result;
	char curbit;
    bool carry = false;

	while(len1 >= 0 && len2 >= 0){
		 curbit = s1[len1] + s2[len2] - '0';
		 if(carry){
		     curbit += 1;
		 }	
		 if(curbit > '9'){
			carry = true;
			curbit -= 10;
		 
		 }else{
		     carry = false;
		 }
		 string tmp;
		 tmp += curbit;
		 tmp += result;
		 result = tmp;
		 len1--;
		 len2--;
	}
	while(len1 >= 0){
		curbit = s1[len1];
		 if(carry){
		     curbit += 1;
		 }	
		 if(curbit > '9'){
			carry = true;
			curbit -= 10;
		 
		 }else{
		     carry = false;
		 }
		 string tmp;
		 tmp += curbit;
		 tmp += result;
		 result = tmp;
		 len1--;
	}

	while(len2 >= 0){
		curbit = s2[len2];
		 if(carry){
		     curbit += 1;
		 }	
		 if(curbit > '9'){
			carry = true;
			curbit -= 10;
		 
		 }else{
		     carry = false;
		 }
		 string tmp;
		 tmp += curbit;
		 tmp += result;
		 result = tmp;
		 len2--;
	}

	if(carry){
	     string tmp;
		 tmp += '1';
		 tmp += result;
		 result = tmp;
	}
    return result;
}

//string 和 char 相乘
string computechar(string str, char ch){
	string result = "";
	int len = str.length() - 1;
	char curbit;
	int carry = 0;

	while(len >= 0){
		curbit = (((str[len] - '0') * (ch - '0')) + carry) % 10 + '0'; 
		carry = (((str[len] - '0') * (ch - '0')) + carry) / 10;
	    string tmp = "";
		tmp += curbit;
		tmp += result;
		result = tmp;
		len--;
	}
	if(carry){
	    curbit = carry  % 10 + '0';
		string tmp = "";
		tmp += curbit;
		tmp += result;
		result = tmp;
		if(carry / 10){
		    curbit = carry / 10 + '0';
			string tmp = "";
			tmp += curbit;
			tmp += result;
			result = tmp;
		}
	}
    return result;
}

//實現乘法的邏輯
string execcompute(string s1, string s2){
	int len1 = s1.length();
	int len2 = s2.length();
	string result = "";
	string tmp = "";
	int base = 0;

	for(int i = len2 - 1; i >= 0; i--){
		tmp = computechar(s1, s2[i]);
		for(int i = 0 ; i < base; i++){
		    tmp += '0';
		}
		result = execadd(result, tmp);
		base++;
	}
	return result;
}

int main(){
	string s1, s2;
	while(cin >> s1 >> s2){
		int len1 = s1.length();
		int len2 = s2.length();
    
		string result;
		if(len1 < len2){
			result = execcompute(s2, s1);
		}else{
			result = execcompute(s1, s2);
		}

		cout << "s1: " << s1 << "		"<< "s2: " << s2 << "		";
		cout << "multi: "<< result << endl;
	}

	return 0;
}


         下面給出一組測試輸出,其中有一些非常大的數,這些樹相乘只能通過大數相乘的思路來實現。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章