C++自带的long long类型表示的最大值是9223372036854775807(19位),如果有两个超过这个范围的数进行运算,就不能使用C++编译器自带的+、-、*了。我们把这种大数用C++里面的string类型进行处理,处理过程中要注意进位、借位、字符转数字的问题。
相加:
string add(string str1, string str2)
{
int len1, len2;
int a[L],b[L];
len1 = str1.length();
len2 = str2.length();
fill(a, a + L, 0);
fill(b, b + L, 0);
int i, j, k,up;
string s;
for (i = len1 - 1, k = 0; i >=0; --i)
{
a[k] = str1[i] - '0';//用数组倒着存储,从数组0开始存储,如果str1是1234,那么数组a就是4,3,2,1
k++;
}
for (j = len2 - 1, k = 0; j >= 0; --j)
{
b[k] = str2[j] - '0';
k++;
}
for (i = 0, up = 0; i < L; ++i)
{
a[i] = a[i] + b[i] + up;
up = a[i] / 10;
a[i] %= 10;
}
for (i =max(len1,len2); i >= 0; --i)
{
if (a[i])
{
break; //a[L]数组从后往前找,第一个不为0的下标,str1+str2的长度最长为他们两中长的那个再加1
}
}
for (k = i; k >= 0; --k)//从下标i开始拼接,倒着拼接
{
s += a[k]+'0';
}
return s;
}
相减:
string sub(string str1, string str2)
{
bool flag = false;
string s;
if (str1 == str2)
return "0";
if (str1.size() < str2.size())
{
swap(str1, str2);
flag = true;
}
if (str1.size() == str2.size())
{
if (str1 < str2)
{
swap(str1, str2);
flag = true;
}
}
int len1, len2;
int a[L], b[L];
len1 = str1.length();
len2 = str2.length();
fill(a, a + L, 0);
fill(b, b + L, 0);
int i, j, k, up;
for (i = len1 - 1, k = 0; i >= 0; --i)
{
a[k] = str1[i] - '0';//用数组倒着存储,从数组0开始存储,如果str1是1234,那么数组a就是4,3,2,1
k++;
}
for (j = len2 - 1, k = 0; j >= 0; --j)
{
b[k] = str2[j] - '0';
k++;
}
for (i = 0, up = 0; i <= max(len1, len2)-1; ++i)
{
if (a[i] > b[i])//这块是大于号,不是大于等于号
{
a[i] = a[i] - b[i] - up;
up = 0;
}
else
{
a[i] = a[i] + 10 - b[i]-up;
up = 1;
}
}
for (i = max(len1, len2)-1; i >= 0; --i)
{
if (a[i])
{
break; //a[L]数组从后往前找,第一个不为0的下标,str1-str2的长度最长为他们两中长的那个
}
}
if (flag == true)
s += '-';
for (k = i; k >= 0; --k)//从下标i开始拼接,倒着拼接
{
s += a[k] + '0';
}
return s;
}
相乘:
string mul(string a, string b) {
if(a=="0"||b=="0")
{
return “0”;//如果ab其中有一个是0,那么结果就是0,防止下面else出现0000结果的情况
}
else
{
string s;
int na[L], nb[L], nc[L], La = a.size(), Lb = b.size(), i, j;
fill(na, na + L, 0);
fill(nb, nb + L, 0);
fill(nc, nc + L, 0);
for (i = La - 1; i >= 0; i--)
na[La - i] = a[i] - '0';//先把字符转换成数字,然后倒着存入数组
for (i = Lb - 1; i >= 0; i--)
nb[Lb - i] = b[i] - '0';
for (i = 1; i <= La; i++)
for (j = 1; j <= Lb; j++)
nc[i + j - 1] += na[i] * nb[j];
for (i = 1; i <= La + Lb; i++)
{
nc[i + 1] += nc[i] / 10;
nc[i] %= 10;
}
if (nc[La + Lb]) //m位数与n位数相乘最长为m+n位,最短位m+n-1位
s += nc[La + Lb] + '0';//如果最高位是1,把该位先拼接出来,如果是0,要把这个0舍去,不进行拼接
for (i = La + Lb - 1; i >= 1; i--)
s += nc[i] + '0';//倒着拼接
return s;
}
}
主函数
#include<string>
#include<iostream>
#include<math.h>
#include<algorithm>
using namespace std;
const int L = 11000;//可以在这块设置大数的范围
int main() {
string x, y;
cin >> x >> y;
//cout << sub(x, y) << endl;
// cout << mul(x, y) << endl;
cout << add(x, y) << endl;
system("pause");
return 0;
}
运行结果:
加;
减:
乘: