大意:用string 类型的两个大数进行相乘,输出结果
输入:样例一:-11 -11
样例二:-15116516166564654646456456454655 121231312313214984894961116
输出:样例一:121
样例二:-1832595092476562998391796185384824031048718264583442194980
思路:纯粹地模拟手动计算两个数相乘的过程即:
- 判断是否带负号,带负号则取出数值部分
- 以一个字符串的每一位去乘另一个字符串的每一,并用一个字符串保存结果
- 补齐第二步中得到字符串的低位,补充相应个数个0
- 将第三步中得到所有字符串进行相加
- 输出负号及第四步中得到的数值结果
#include <iostream> #include <string> using namespace std; string max_i,min_i; string count_add(string s1,string s2) //进行两个数相加 { max_i = s1;min_i = s2; if(s2.size()>s1.size()) { max_i = s2; //取长度大的数为max min_i = s1; } for(int i = min_i.size()-1,j = max_i.size()-1; i>=0;i--,j--) //模拟整数加的过程 { max_i[j] += min_i[i] -‘0‘; //选择将结果保存在max变量中 if(max_i[j] > ‘9‘) //字符值大于9需要处理 { if(j > 0) { max_i[j - 1] ++; max_i[j] -= 10; } else { max_i = "1" + max_i; max_i[j] -= 10; } } } return max_i; } int main() { string s1,s2; cin>>s1>>s2; int i,j; bool nega_s1 = false,nega_s2 = false; if(s1[0] == ‘-‘) //若带负号,则取出数字部分 { nega_s1 = true; s1 = s1.substr(1); //将第一位开始的部分重新赋给s } if(s2[0] == ‘-‘) { nega_s2 = true; s2 = s2.substr(1); } char unit, decade = ‘0‘; int a,b; string result_one[s2.size()]; //保存中间的s2的每一位乘s1的结果 for(i = s2.size()-1; i >= 0; i--) //模拟相乘过程 { a = s2[i] - ‘0‘; for(j = s1.size()-1; j >= 0; j--) { b = s1[j] - ‘0‘; unit =((a * b) + decade - ‘0‘) % 10 + ‘0‘ ; //保存两个数字相乘的个位、十位 decade = ((a * b) + decade - ‘0‘) / 10 + ‘0‘; result_one[s2.size() -1- i] = unit + result_one[s2.size() -1- i] ; } if(decade != ‘0‘) result_one[s2.size() -1- i] = decade + result_one[s2.size() -1- i]; decade = ‘0‘; } for(i = 0; i < s2.size(); i++) //对中间结果补齐位数 { for(j = i;j > 0; j--) { result_one[i] = result_one[i] + ‘0‘; } } string sum = "0"; //用sum变量保存最终结果 for(i = 0;i < s2.size(); i++) { sum = count_add(sum,result_one[i]); //相加 } int tip = 0; for(i = 0; i < sum.size(); i++) //找出非零的起始位置 { if(sum[i] == ‘0‘ ) { tip ++; } else break; } if(nega_s1 + nega_s2 == 1) //输出符号 cout<<"-"; for(i = tip ; i < sum.size(); i++) //输出数字部分答案 { cout<<sum[i]; } if(tip == sum.size()) cout<<"0"; return 0; }
补充:输出进行了一定处理,防止输出0001这样的结果(即不输出数字开始的0)
运行截图如下
再试试真正的大数相乘
原文地址:https://www.cnblogs.com/z1223/p/9637995.html
时间: 2024-10-11 22:50:46