高精度计算 加减乘除
4.高精度计算
791. 高精度加法
给定两个正整数,计算它们的和。
输入格式
共两行,每行包含一个整数。
输出格式
共一行,包含所求的和。
数据范围
1≤整数长度≤1000001≤整数长度≤100000
输入样例:
12
23
输出样例
35
#include<iostream>
#include<vector>
using namespace std;
//默认a更长
vector<int> add( vector<int> &a, vector<int> &b){
if(b.size()>a.size()) return add(b,a);
//位对齐
while (b.size() != a.size()) b.push_back(0);
vector<int> res(a.size()+1);
int i;
for( i= 0; i <a.size()&&i<b.size(); i++){
int t = (a[i]+b[i]+res[i])/10;
res[i]=((a[i]+b[i])+res[i])%10;
res[i+1] = t;
}
if(*(res.end()-1)==0) res.pop_back();
return res;
}
int main(){
string A,B;
cin>>A>>B;
vector<int> a;
vector<int> b;
for(int i = A.size()-1; i>=0; i--) a.push_back(A[i]-'0');
for(int i = B.size()-1; i>=0; i--) b.push_back(B[i]-'0');
auto res = add(a,b);
for(int i = res.size()-1; i>=0; i--) cout<<res[i];
}
位对齐处理边界。
729.高精度减法
给定两个正整数,计算它们的差,计算结果可能为负数。
输入格式
共两行,每行包含一个整数。
输出格式
共一行,包含所求的差。
数据范围
1≤整数长度≤1051≤整数长度≤105
输入样例:
32
11
输出样例
21
#include <iostream>
#include <vector>
using namespace std;
vector<int> sub(vector<int>& a, vector<int>& b) {
vector<int> c;
while (b.size() != a.size()) b.push_back(0);
for (int i = 0; i < a.size(); i++) {
//借位
if (a[i] < b[i]) {
a[i] += 10;
a[i + 1]--;
}
c.push_back(a[i] - b[i]);
}
//移除末尾元素
for(int i = c.size()-1;i>=0;i--){
if(c[i]==0) c.pop_back();
else break;
}
return c;
}
int main() {
string sa;
string sb;
vector<int> a;
vector<int> b;
cin >> sa;
cin >> sb;
int op = 1;
for (int i = sa.size() - 1; i >= 0; i--) a.push_back(sa[i] - '0');
for (int i = sb.size() - 1; i >= 0; i--) b.push_back(sb[i] - '0');
vector<int> c;
//以下代码判断两个数的大小
//若后一个数比前一个数要长,则
if (b.size() > a.size()) op = -1;
if(a.size()==b.size()){
//若两者长度相等
for(int i = a.size()-1; i>=0;i++){
if(a[i]>b[i]) break;
if(b[i]>a[i]){
op = -1;
break;
}
}
}
if(op==1) c = sub(a,b);
else c = sub(b,a);
if(c.size()==0){
cout<<0;
return 0;
}
if(op==1)for (int i = c.size() - 1; i >= 0; i--) cout << c[i];
else{
cout<<"-";
for (int i = c.size() - 1; i >= 0; i--) cout << c[i];
}
return 0;
}
要先判断谁大谁小,再调用sub(a,b) 默认a比b大。
位对齐处理边界。
794.高精度乘法
给定两个正整数A和B,请你计算A * B的值。
输入格式
共两行,第一行包含整数A,第二行包含整数B。
输出格式
共一行,包含A * B的值。
数据范围
1≤A的长度≤1000001≤A的长度≤100000,
0≤B≤100000≤B≤10000
输入样例:
2
3
输出样例:
6
#include <iostream>
#include<vector>
using namespace std;
vector<int> mult(vector<int>& a, int b) {
vector<int> c;
int t = 0;
for (int i = 0; i < a.size() || t != 0; i++) {
int cur = 0;
if (i < a.size()) cur = a[i] * b;
else cur = 0;
c.push_back((cur + t) % 10);
t = (t +cur) / 10;//不能写成t/10+cur/10!!!
}
//去0
for(int i = c.size()-1; i>0; i--){
if(c[i]==0) c.pop_back();
else break;
}
return c;
}
int main() {
string sa;
int b;
cin >> sa >> b;
vector<int> a;
for (int i = sa.size() - 1; i >= 0; i--) a.push_back(sa[i] - '0');
auto c = mult(a, b);
for (int i = c.size() - 1; i >= 0; i--) cout << c[i];
}
注意(t+cur)/10
不能写成t/10+cur/10!
!!
794 .高精度除法
给定两个非负整数A,B,请你计算 A / B的商和余数。
输入格式
共两行,第一行包含整数A,第二行包含整数B。
输出格式
共两行,第一行输出所求的商,第二行输出所求余数。
数据范围
1≤A的长度≤1000001≤A的长度≤100000,
1≤B≤100001≤B≤10000
BB 一定不为0
输入样例:
7
2
输出样例:
3
1
#include <iostream>
#include<vector>
using namespace std;
vector<int> mult(vector<int>& a, int b, int &r) {
vector<int> c;
for (int i = 0; i < a.size() || t != 0; i++) {
int cur = 0;
if (i < a.size()) cur = a[i] * b;
else cur = 0;
c.push_back((cur + t) % 10);
t = (t +cur) / 10;//不能写成t/10+cur/10
}
//去0
for(int i = c.size()-1; i>0; i--){
if(c[i]==0) c.pop_back();
else break;
}
return c;
}
int main() {
string sa;
int b;
cin >> sa >> b;
vector<int> a;
//为了适配混合运算,所以还是倒着存
for (int i = sa.size() - 1; i >= 0; i--) a.push_back(sa[i] - '0');
r = 0;
auto c = mult(a, &b,);
for (int i = c.size() - 1; i >= 0; i--) cout << c[i];
cout<<endl;
cout<<b<<endl;
}
除法用余数,乘法加法用进位。