1.高精度加法
字符串输入,数组存储
#include<iostream>
#include<string>
#include<algorithm>
#include<cstring>
using namespace std;
int main()
{
string s1, s2; //用字符串输入大数
int a[505], b[505],c[505]; //用数组储存大数每一位上的数字
memset(c, 0, sizeof(c));
memset(b, 0, sizeof(b));
memset(a, 0, sizeof(a));
cin >> s1 >> s2;
for (int i = 0; i < s1.size(); i++)
a[i] = s1[s1.size() - i - 1] - '0';
for (int i = 0; i < s2.size(); i++)
b[i] = s2[s2.size() - i - 1] - '0';
int cnt = max(s1.size(), s2.size()) ;
for (int i = 0; i <=cnt; i++) //核心算法
{
c[i] = a[i] + b[i]+c[i];
c[i + 1] = c[i] / 10;
c[i] = c[i] % 10;
}
if (c[cnt] == 0L && cnt > 0) cnt--; //若最高位有进位,则不管,否则把前导0删除
for (int i = cnt ; i >= 0; i--)
cout << c[i];
return 0;
}
2.高精度减法
字符串输入,数组存储
需要判断正负
//高精度减法
//数量级小于10的500次方
#include<iostream>
#include<string>
#include<algorithm>
#include<cstring>
using namespace std;
int main()
{
string s1, s2; //用字符串输入大数
int a[505], b[505], c[505]; //用数组储存大数每一位上的数字
memset(c, 0, sizeof(c));
memset(b, 0, sizeof(b));
memset(a, 0, sizeof(a));
cin >> s1 >> s2;
int flag = 0;
if (s1.size()<s2.size()||(s1.size()==s2.size()&&s1<s2)) //判断两个数字谁大
{ //长度小的和长度相同但字典序小的 需要交换
flag = 1;
string t = s1;
s1 = s2;
s2 = t;
}
for (int i = 0; i < s1.size(); i++)
a[i] = s1[s1.size() - i - 1] - '0';
for (int i = 0; i < s2.size(); i++)
b[i] = s2[s2.size() - i - 1] - '0';
int cnt = max(s1.size(), s2.size());
for (int i = 0; i <= cnt; i++) //核心算法
{
if (a[i] < b[i])
{
a[i + 1]--;
a[i] += 10;
}
c[i] = a[i] - b[i];
}
while (c[cnt] == 0 && cnt > 0) cnt--;
if (flag == 1) //若是负数,直接输出负号
cout << '-';
for (int i = cnt; i >= 0; i--)
cout << c[i];
return 0;
}
3.高精度乘法