高精度加法
加运算步骤
1 从低位到高位(相当于是字符串翻转) ,比较他们的长度,长度不一致,在在前方补'0'
num2=string(len1-len2,'0')+num2;
2 然后将他们的同位相加,注意 string result="";
-
转化为数字再相加,并且进位carry=0(初始化) sum=(num1[i]-'0')+(num2[i]-'0')+carry;
-
获取进位数和结果数的一部分
result=(char)(sum%+'0')+result
carry=sum/10;
3 判断最高位是否进位
if(carry>0)
result=char(carry+‘0)+result
#include<bits/stdc++.h>
using namespace std;
string add(string num1, string num2) {
if(num1.empty() && num2.empty()) return "0"; // 如果两个输入都是空字符串,返回 "0"
int len1 = num1.length();
int len2 = num2.length();
// 保证 num1 总是更长的字符串
if(len1 < len2) {
swap(num1, num2);
}
// 将较短的字符串补零
num2 = string(len1 - len2, '0') + num2;
string result = "";
int sum = 0;
int carry = 0;
// 从个位开始计算
for(int i = len1 - 1; i >= 0; i--) {
sum = (num1[i] - '0') + (num2[i] - '0') + carry;
result = (char)(sum % 10 + '0') + result; // 计算当前位的数字
carry = sum / 10; // 计算进位
}
// 如果最终有进位,添加进位到结果
if(carry > 0) {
result = (char)(carry + '0') + result;
}
return result;
}
int main() {
string num1, num2;
cin >> num1 >> num2;
// 检查输入是否有效
if (num1.empty() || num2.empty()) {
cout << "Invalid input!" << endl;
return 1; // 返回错误状态
}
cout << add(num1, num2) << endl; // 输出结果
return 0;
}
高精度减法
1比较长度,补'0'
num2=string(len1-len2,'0')+num2;
2 同位计算他们的差值
int boorow=0;
int diff=(num1[i]-'0')-(num2[i]-'0')-borrow;
if(diff<0){
//需要借位
diff+=10;
borrow=1;
}
else{
borrow=0;
}
result = char(diff + '0') + result;
//这个不需要交换,相减可能会出现负数
// 确保a是较长的字符串
if (a.length() < b.length()) {
cout << "-" << subtract(b, a) << endl;
} else {
cout << subtract(a, b) << endl;
}
3 删除前置的0
int count=0//算算前置的0有多少个
for(int i=0;i<result.length()-1;i++){
if(result[i]!='0'){
break;
}
count++;
}
result=result.substr(count);
#include <iostream>
#include <string>
using namespace std;
// 高精度减法函数
string subtract(string num1, string num2) {
if (num1.length() < num2.length()) {
swap(num1, num2);
}
int len1 = num1.length();
int len2 = num2.length();
// 在较短的字符串前补0,使两个字符串长度相同
num2 = string(len1 - len2, '0') + num2;
string result = "";
int borrow = 0;
for (int i = len1 - 1; i >= 0; --i) {
int diff = (num1[i] - '0') - (num2[i] - '0') - borrow;
if (diff < 0) {
diff += 10;
borrow = 1;
} else {
borrow = 0;
}
result = char(diff + '0') + result;
}
// 删除结果中的前导0
int count = 0; // 初始化count变量
for (int i = 0; i < result.length(); ++i) {
if (result[i] != '0') {
break;
}
count++;
}
if (count == result.length()) {
result = "0";
} else {
result = result.substr(count);
}
return result;
}
int main() {
string a, b;
cin >> a >> b;
// 确保a是较长的字符串
if (a.length() < b.length()) {
cout << "-" << subtract(b, a) << endl;
} else {
cout << subtract(a, b) << endl;
}
return 0;
}
高精度乘法
-
逐位相乘,从被乘数的最低位开始,逐位与乘法相乘,得到部分乘积,需要记录每一步的部分乘积,并考虑进位的情况
-
部分乘积相加,得到部分乘积后,将所有的乘积相加,得到相加的过程中,需要考虑进位
-
处理进位:在逐位相乘和部分乘积相加的过程中,需要考虑进位的情况。确保进位的正确处理,不会遗漏或错误处理进位情况。
-
处理小数部分:如果需要进行高精度乘法,可能会涉及到小数部分的处理。在进行乘法操作后,需要继续处理小数部分,直到达到指定的精度要求。
#include <iostream> #include <string> #include <vector> #include <algorithm> using namespace std; // 高精度乘法函数 string multiply(string num1, string num2) { if (num1 == "0" || num2 == "0") return "0"; int len1 = num1.size(), len2 = num2.size(); vector<int> result(len1 + len2, 0); // 逐位相乘并累加 for (int i = len1 - 1; i >= 0; --i) { for (int j = len2 - 1; j >= 0; --j) { int mul = (num1[i] - '0') * (num2[j] - '0'); int ssum = mul + resuslt[i + j + 1]; result[i + j + 1] = sum % 10; result[i + j] += sum / 10; } } //result[i+j+1]是保存十位, result[i+j]是保存个位 // result[i + j + 1] 用于存储从 result[i + j] 进位上来的值。在进行下一位乘法之前,我们需要将这个进位加到新的乘积上。 //当我们逐位相乘时,num1[i] * num2[j] 的结果可能会影响 result 数组中的两个位置: //result[i + j]:这个位置存储的是乘积的个位数。 //result[i + j + 1]:这个位置存储的是乘积的十位数,也就是进位。 // 将结果转换为字符串 string res = ""; for (int i = 0; i < result.size(); ++i) { if (i == 0 && result[i] == 0) continue; // 跳过前导零 res.push_back(result[i] + '0'); } //行代码的作用是检查数组 result 的第一个元素是否为0。如果是,那么这个0就不会被添加到结果字符串 res 中。这里的 i 是 for 循环的索引变量,它从0开始,逐个访问 result 数组中的每个元素。 if (res.empty()) return "0"; reverse(res.begin(), res.end()); return res; } int main() { string a, b; cin >> a >> b; cout << multiply(a, b) << endl; return 0; }
方法二:使用双层for循环
-
代码如下
#include <iostream> using namespace std; const int N = 2010; int a[N], b[N], c[N]; int la, lb, lc; void mul(int c[], int a[], int b[]) { for (int i = 0; i < la; i++) { for (int j = 0; j < lb; j++) { c[i + j] += a[i] * b[j]; // 无进位乘法 } } // 处理进位 for (int i = 0; i < lc; i++) { c[i + 1] += c[i] / 10; c[i] %= 10; } while (lc != 1 && c[lc - 1] == 0) lc--; } int main() { string x, y; cin >> x >> y; la = x.size(); lb = y.size(); lc = la + lb; for (int i = la - 1; i >= 0; i--) a[la - 1 - i] = x[i] - '0'; for (int i = lb - 1; i >= 0; i--) b[lb - 1 - i] = y[i] - '0'; mul(c, a, b);// c = a * b; for (int i = lc - 1; i >= 0; i--) cout << c[i]; return 0; }
高精度除法
目录