题意
给你两个数 a 和 b, 这两个数很大, 然后输出这两个数相加的和, 相乘的积.
解题思路
模拟, 但是还是搜了搜代码实现, 发现这个大佬写的是真的简洁高效.
下面第一个代码转自博客(修改了一些) 》》》
第二个代码是 CZH 同学的代码, 代码更是简单易懂!
代码实现
- #include <iostream>
- #include <sstream>
- #include <algorithm>
- #include <cstring>
- #include <string>
- using namespace std;
- //C++ 大数相加
- string BigNumAdd(const string& strNum1, const string& strNum2)
- {
- string strSum;
- int len1 = strNum1.size()-1;
- int len2 = strNum2.size()-1;
- int bit = 0; // 保存进位
- // 从结尾开始每位相加
- while (len1>=0 && len2>=0)
- {
- // 求每位的和(要把进位也加上)
- int tmpSum = strNum1[len1]-'0' + strNum2[len2]-'0' + bit;
- // 保存进结果
- strSum += tmpSum % 10 + '0';
- // 求进位
- bit = tmpSum / 10;
- --len1;
- --len2;
- }
- // 两个整数长度不相等(肯定有一个已经加完了, 不需要再额外加 if 来判断, 因为 while 就可以判断)
- while (len1>= 0)
- {
- // 和上个 while 循环一样
- int tmpSum = strNum1[len1]-'0' + bit;
- strSum += tmpSum % 10 + '0';
- bit = tmpSum / 10;
- --len1;
- }
- while (len2>= 0)
- {
- // 和上个 while 循环一样
- int tmpSum = strNum2[len2]-'0' + bit;
- strSum += tmpSum % 10 + '0';
- bit = tmpSum / 10;
- --len2;
- }
- // 最高位有进位
- if (bit != 0)
- strSum += bit + '0';
- // 反转
- reverse(strSum.begin(), strSum.end());
- return strSum;
- }
- //C++ 大数相乘
- string BigNumMultiply(const string& strNum1, const string& strNum2)
- {
- string strMultiply;
- // 两数相乘最大有 m+n 位
- int bit = 0;
- int len1 = strNum1.size()-1;
- int len2 = strNum2.size()-1;
- // 计算每一位
- for (int i=0; i<len1+len2+2; ++i)
- {
- // 计算结果的第 i 位(权值肯定为 i, 第 1 位也就是个位权值为 0(pow(10, 0)))
- // 等于乘数的第 (i~0) 位分别与被乘数的第 (0~i) 位相乘, 因为这样每位相乘之后权值仍为 i
- // 然后相加再加上前一位的进位, 就是结果的第 i 位
- // 然后 %10 得出第 i 位,/10 得到进位
- int tmp = 0;
- for (int j=i; j>=0; --j)
- {
- // 如果下标超出字符串的范围 j 为 num1 的下标, i-j 为 num2 的下标, 然后两数相乘
- if (j>len1 || (i-j)>len2)
- continue;
- // 还要注意字符串数字的最高位在字符串的最低位所以得用 len 减去
- tmp += (strNum1[len1-j]-'0') * (strNum2[len2-(i-j)]-'0');
- }
- // 加上进位
- tmp += bit;
- // 为了防止最后一位是 0, 但是却加上了
- if (tmp == 0 && i == len1+len2+1)
- break;
- // 求余得到结果的第 i 位
- strMultiply += tmp % 10 + '0';
- // 计算新的进位
- bit = tmp / 10;
- }
- // 判断结果的最后一个字符如果是 0 的话说明可以删去
- //if (strMultiply[strMultiply.size()-1] == '0')
- // strMultiply[strMultiply.size()-1] = '\0';
- // 反转
- reverse(strMultiply.begin(), strMultiply.end());
- return strMultiply;
- }
- int main()
- {
- string str1;
- string str2;
- cin>> str1>> str2;
- // 相加和相乘
- cout <<BigNumAdd(str1, str2) << endl;
- cout << BigNumMultiply(str1, str2) << endl;
- return 0;
- }
- #include<iostream>
- #include<cstdio>
- #include<algorithm>
- using namespace std;
- const int maxn = 10010;
- int a[maxn],b[maxn];
- int ans[maxn];
- int ans2[maxn];
- int main()
- {
- string s1,s2;
- cin>>s1>>s2;
- int len1 = s1.length();
- int len2 = s2.length();
- int lenans = 0, lenans2 = 0;
- int n = 0;
- for(int i=0;i<len1;i++)
- a[i] = s1[i]-'0';
- reverse(a, a+len1);
- for(int i=0;i<len2;i++)
- {
- b[i] = s2[i]-'0';
- n = n*10 + s2[i]-'0';
- }
- reverse(b, b+len2);
- for(int i=0,up=0;i<maxn;i++)
- {
- ans[i] = a[i]+b[i]+up;
- up = ans[i]/10;
- ans[i] %= 10;
- }
- for(int i=maxn-1;i!=-1;i--)
- {
- if(ans[i])
- {
- lenans = i;
- break;
- }
- }
- for(int i=lenans;i!=-1;i--)
- cout<<ans[i];
- cout<<endl;
- for(int i=0;i<maxn;i++)
- {
- ans2[i] = a[i]*n+ans2[i];
- ans2[i+1] = ans2[i]/10;
- ans2[i] %= 10;
- }
- for(int i=maxn-1;i!=-1;i--)
- {
- if(ans2[i])
- {
- lenans2 = i;
- break;
- }
- }
- for(int i=lenans2;i!=-1;i--)
- cout<<ans2[i];
- cout<<endl;
- return 0;
- }
来源: http://www.bubuko.com/infodetail-3210360.html