一般所說的大數即超出了系統所支持的最大類型的整形的表示範圍,對於這種大的數不能用整形類型來表示,只能通過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;
}
下面給出一組測試輸出,其中有一些非常大的數,這些樹相乘只能通過大數相乘的思路來實現。