洛谷题目链接:
高精度加法:https://www.luogu.com.cn/problem/P1601
高精度减法:https://www.luogu.com.cn/problem/P2142
高精度加法解题步骤:
1. 高精度数字利用字符串读入
2.把字符串翻转存入两个整形数组A,B
3.从低位到高位,累加,进位,存余
4.把数组C从高位到地位依次输出
我的代码:
?数组做法:
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
const int N = 1000;
int a[N], b[N], c[N];
int la, lb, lc;
void add(int a[], int b[], int c[]) {
for (int i = 0; i < lc; i++) {
c[i] += a[i] + b[i];//累加
c[i + 1] += c[i] / 10;//进位
c[i] %= 10;//存余
}
if (c[lc])lc++;
}
int main() {
string s1, s2;
cin >> s1 >> s2;
la = s1.size(), lb = s2.size();
lc = max(la, lb);
for (int i = la - 1; ~i; i--)a[la - 1 - i] = s1[i] - '0';
for (int i = lb - 1; ~i; i--)b[lb - 1 - i] = s2[i] - '0';
add(a, b, c);
for (int i = lc - 1; ~i; i--)cout << c[i];
return 0;
}
?vector容器做法:
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
typedef vector<int> VI;
VI a, b, c;
void add(VI& a, VI& b, VI& c) {
int t = 0;
for (int i = 0; i < a.size() ||i< b.size(); i++) {
if (i < a.size())t += a[i];
if (i < b.size())t += b[i];
c.push_back(t % 10);//存余
t /= 10;//进位
}
if (t)c.push_back(t);
}
int main() {
string s1, s2;
cin >> s1 >> s2;
for (int i = s1.size() - 1; ~i; i--)a.push_back(s1[i]-'0');
for (int i = s2.size() - 1; ~i; i--)b.push_back(s2[i]-'0');
add(a, b, c);
for (int i = c.size() - 1; ~i; i--)cout << c[i];
return 0;
}
高精度减法解题步骤:
1.高精度数字利用字符串读入
2.把字符串翻转存入两个整形数组A,B
3.若A<B,则交换A,B,输出负号
4.从低位到高位,逐位求差,借位,存差
5.把数组C从高位到低位依次输出
我的代码:
?数组做法:
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
const int N = 11000;
int a[N], b[N], c[N];
int la, lb, lc;
bool cmp(int a[], int b[]) {
if (la != lb)return la > lb;//返回真不交换
for (int i = la-1; i >=0; i--) {
if (a[i] != b[i])return a[i] > b[i];
}
return true; //避免出现-0;
}
void sub(int a[], int b[], int c[]) {
for (int i = 0; i < lc; i++) {
if (a[i] < b[i])
a[i + 1]--, a[i] += 10;
c[i] = a[i] - b[i];
}
while (lc && c[lc] == 0)lc--;//处理前导0
}
int main() {
string s1, s2;
cin >> s1 >> s2;
la = s1.size(), lb = s2.size();
lc = max(la, lb);
for (int i = la - 1; ~i; i--)a[la - 1 - i] = s1[i]-'0';
for (int i = lb - 1; ~i; i--)b[lb - 1 - i] = s2[i] - '0';
if (!cmp(a, b))swap(a, b), cout << "-";
sub(a, b, c);
for (int i = lc; ~i; i--)cout << c[i];
return 0;
}
?vector容器做法:
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
typedef vector<int> VI;
VI a, b, c;
bool cmp(VI& a, VI& b) {
if (a.size() != b.size())return a.size() > b.size();
for (int i = a.size() - 1; i >= 0; i--) {
if (a[i] != b[i])return a[i] > b[i];
}
return true; //避免出现-0
}
void sub(VI& a, VI& b, VI& c) {
int t = 0;
for (int i = 0; i < a.size(); i++) {
t = a[i];
if (i < b.size())t -= b[i];
if (t < 0)a[i + 1]--,t+=10;
c.push_back(t);
}
while (c.size() > 1 && !c.back())c.pop_back(); //处理前导0
}
int main() {
string s1, s2;
cin >> s1 >> s2;
for (int i = s1.size() - 1; ~i; i--)a.push_back(s1[i] - '0');
for (int i = s2.size() - 1; ~i; i--)b.push_back(s2[i] - '0');
if (!cmp(a, b))swap(a, b),cout<<"-";//保证a永远比b大
sub(a, b, c);
for (int i = c.size() - 1; ~i; i--)cout << c[i];
return 0;
}