提示:本文主要记录了正整数中: 高精度 +- 高精度; 高精度*低精度, 高精度 / 低精度, 高精度 * 高精度
一、高精度 + 高精度
#include <iostream>
#include <vector>
using namespace std;
const int N = 1e6 + 10;
vector<int> add(vector<int> &a, vector<int> &b) //加上引用,提高效率,不会拷贝整个数组
{
vector<int>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(1);
/*最后一次加法有进的一,加进去(因为十进制最大进的就是1)
三位数加三位数有可能是四位数
一个大数减一个小数,肯定不会超过这数本身位数,最后没有必要讨论 t(但要处理前导0)
*/
return c;
}
int main(void){
string A, B;
vector <int> a,b;
cin >> A >> 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 c = add(a, b);
for(int i = c.size() - 1; i >= 0; i --) printf("%d", c[i]);
return 0;
}
二、高精度 - 高精度
代码如下:
//(-4 % 10) = -4; (-4+10) % 10 = 6;
#include <iostream>
#include <vector>
using namespace std;
//判断a >= b
bool cmp(vector<int> &a, vector<int> &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; //等于也返回true,输出没有-号
}
vector<int> sub(vector<int> &a, vector<int> &b) //加上引用,提高效率,不会拷贝整个数组
{
vector<int>c;
int t = 0; //借位
for(int i = 0; i < a.size(); i ++){ //这里我们保证了a.size() >= b.size()
t = a[i] - t;
if(i < b.size()) t -= b[i];
c.push_back((t + 10) % 10);
if(t < 0) t = 1;
else t = 0;
}
while(c.size() > 1 && c.back() == 0) c.pop_back(); //考虑最后得数是否为0
return c;
}
int main(void){
string A, B;
vector <int> a,b;
cin >> A >> 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');
if(cmp(a, b)){
auto c = sub(a, b);
for(int i = c.size() - 1; i >= 0; i --) printf("%d", c[i]);
}
else{
auto c = sub(b, a);
printf("-");
for(int i = c.size() - 1; i >= 0; i --) printf("%d", c[i]);
}
return 0;
}
三、高精度* 低精度
代码如下:
#include <iostream>
#include <vector>
using namespace std;
vector<int> mul(vector<int> &a, int b) //加上引用,提高效率,不会拷贝整个数组
{
vector<int>c;
int t = 0; //进位
for(int i = 0; i < a.size() || t; i ++){
//这里我们保证了最后t不为0, 需要存储到c数组中
if(i < a.size()) t += a[i] * b;
c.push_back(t % 10);
t /= 10;
}
while(c.size() > 1 && c.back() == 0) c.pop_back();
/*
预防 987 * 0 = 000 要去掉前导0
*/
return c;
}
int main(void){
string A;
int b;
vector <int> a;
cin >> A;
cin >> b;
//大整数用数组,逆序存储
for(int i = A.size() - 1; i >= 0; i--) a.push_back(A[i] - '0');
auto c = mul(a, b);
for(int i = c.size() - 1; i >= 0; i --){
printf("%d", c[i]);
}
return 0;
}
四、高精度 / 低精度
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> div(vector<int> &a, int b, int &r) //加上引用,提高效率,不会拷贝整个数组
{
vector<int>c;
r = 0; //进位
/*除法和 +-*不一样,得从最高位开始算, 而+-*都是从最低位开始算*/
for(int i = a.size() - 1; i >= 0; i --){
r = r * 10 + a[i];
c.push_back(r / b);
r %= b;
}
//因为我们最后逆序输出的,(在这里c就是答案,) 所以我们在这逆序一下
reverse(c.begin(), c.end());
while(c.size() > 1 && c.back() == 0) c.pop_back();//去掉前导0
return c;
}
int main(void){
string A;
int b;
vector <int> a;
cin >> A;
cin >> b;
//大整数用数组,逆序存储
for(int i = A.size() - 1; i >= 0; i--) a.push_back(A[i] - '0');
int r;
auto c = div(a, b, r);
for(int i = c.size() - 1; i >= 0; i --){
printf("%d", c[i]);
}
cout << endl;
cout << r << endl;
return 0;
}
五、高精度 * 高精度
n位数 * m位数不会超过 n + m + 1 位, 转换成从0开始的数组下标时, n - 1 + m - 1 + 1 = n - m - 1, 即答案数组的最大长度为n-m-1, 需要讨论数组最后一个数,即最高位数是否为0(前导0)
#include <iostream>
#include <cstring>
using namespace std;
string s1, s2;
int a[300], b[300], res[600];
int main()
{
while(cin >> s1 >> s2){
if(s1 == "0" || s2 == "0"){
printf("0\n");
continue;
}
memset(res, 0, sizeof(res));
int l1 = s1.size();
int l2 = s2.size();
for(int i = l1 - 1; i >= 0; i --){
a[l1 - 1 - i] = s1[i] - '0';
}
for(int i = l2 - 1; i >= 0; i --){
b[l2 - 1 - i] = s2[i] - '0';
}
int t = 0;
for(int i = 0; i < l1; i ++){
for(int j = 0; j < l2; j ++){
res[i + j] += a[i] * b[j];
}
}
for(int i = 0; i < l1 + l2; i ++){
t = res[i] / 10;
res[i] %= 10;
res[i + 1] += t;
}
for(int i = l1 +l2 - 1; i >= 0; i --){
if(i == l1 + l2 - 1){
if( res[i] != 0){
printf("%d", res[i]);
}
}
else{
printf("%d", res[i]);
}
}
printf("\n");
}
return 0;
}