首先先写一个进位的函数
vector<int> jinwei(vector<int> result, int num, int digit)
{
num = result[digit] + num; //本位的进位数加上两个数在本位的和
if (num >= 10) //进位
{
int jin = num / 10;
int save = num % 10;
result[digit] = save;
result = jinwei(result, jin, digit + 1);
}
else //不进位
{
result[digit] = num;
}
return result;
}
1、大数相加
直接贴代码了
void bigadd()
{
string str1;
string str2; //两个用字符串表示的数
cin >> str1 >> str2; //输入
int len1 = str1.length();
int len2 = str2.length(); //获取数字长度
int n = len1 > len2 ? len1 + 1 : len2 + 1; //两个数相加得到结果最大位数为其最大数的长度+1
int i;
vector<int> result(n);
if (len1 > len2) // 数字1比较大
{
for ( i = 0; i < len2; i++) //先把两个数都有的位相加
{
int num1 = str1[len1 - 1 - i]-'0';
int num2 = str2[len2 - 1 - i]-'0';
int num = num1 + num2;
result = jinwei(result, num, i);
}
for (; i < len1; i++) //再把较大的数多余的位进行计算
result = jinwei(result, str1[i] - '0', i);
}
else //数字2比较大
{
for ( i = 0; i < len1; i++)
{
int num1 = str1[len1 - 1 - i] - '0';
int num2 = str2[len2 - 1 - i] - '0';
int num = num1 + num2;
result = jinwei(result, num, i);
}
for (; i < len2; i++)
result = jinwei(result, str2[i] - '0', i);
}
if (result[n - 1] == 0) //最高位为0
n--;
for (int i = n - 1; i >= 0; i--)
cout << char(result[i] + '0');
return;
}
2、大数相乘
依然代码~
void bigmulti()
{
string str1;
string str2; //两个用字符串表示的数
cin >> str1 >> str2; //输入
int len1 = str1.length();
int len2 = str2.length(); //获取数字长度
int n = len1 + len2; //两个数相乘,位数最多为两个数字位数之和,最少为和-1
vector<int> result(n);
for (int i = len1 - 1; i >= 0; i--) //被乘数每一位依次和乘数的每一位进行乘法运算
{
for (int j = len2 - 1; j >= 0; j--) //乘数的每一位
{
int num1 = str1[i] - '0';
int num2 = str2[j] - '0';
int num = num1*num2;
int digit = len1 - 1 - i + len2 - 1 - j;
result = jinwei(result, num, digit);
}
}
if (result[n - 1] == 0) //最高位为0
n--;
for (int i = n - 1; i >= 0; i--)
cout << char(result[i] + '0');
return ;
}