大数相乘的实现
发布时间:2020-12-14 02:21:08 所属栏目:大数据 来源:网络整理
导读:??????? 一般所说的大数即超出了系统所支持的最大类型的整形的表示范围,对于这种大的数不能用整形类型来表示,只能通过string 类型来表示。对于两个用string 类型来表示的大数,其乘法实现按两个数相乘的一般法则来实现。返回类型也用string 类型来表示。 /
??????? 一般所说的大数即超出了系统所支持的最大类型的整形的表示范围,对于这种大的数不能用整形类型来表示,只能通过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; } ???????? 下面给出一组测试输出,其中有一些非常大的数,这些树相乘只能通过大数相乘的思路来实现。
??
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |