AcWing-高精度-加法-减法-乘法

高精度加法

#include <iostream>
#include <vector>
using namespace std;

const int N = 200 + 11;

vector<int> add(vector<int>& v1,vector<int>& v2){
	 vector<int> res;
	int t = 0;
	int i = 0,j = 0;
	while(i < v1.size() || j < v2.size()){
		if(i < v1.size())  t += v1[i++];
		if(j < v2.size()) t += v2[j++];
		res.push_back(t%10);
		t /= 10;
	}
	if(t > 0) res.push_back(t);
	return res;
}

int main(int argc, char const *argv[]){
	string a,b; cin >> a >> b;
	vector<int> v1,v2;
	for(int i = a.length()-1; i >= 0; i--) v1.push_back(a[i]-'0');
	for(int i = b.length()-1; i >= 0; i--) v2.push_back(b[i]-'0');

	vector<int> res = add(v1,v2); 
	while(res.size() > 1 && res.back() == 0) res.pop_back(); 	//去除前导0
	for(int i = res.size()-1; i >= 0; i--) cout << res[i]; cout << endl;
	return 0;
}

高精度减法

#include <iostream>
#include <vector>
using namespace std;

bool cmp(vector<int>& v1,vector<int>& v2){
    if(v1.size() != v2.size()) return v1.size() > v2.size();
    for(int i = v1.size()-1; i >= 0; i--){
        if(v1[i] != v2[i])
            return v1[i] > v2[i];
    }
    return true;
}
vector<int> sub(vector<int>&v1, vector<int>&v2){
    vector<int> res;
    int t  = 0;
    for(int i = 0; i < v1.size();i++){
        v1[i] += t; //借位
        if(i < v2.size()) v1[i] -= v2[i];
        res.push_back((v1[i]+10)%10);
        if(v1[i] < 0) t = -1;
        else t = 0;
    }
    //去掉高位0
    while(res.size() > 1 && res.back() == 0) res.pop_back();
    return res;
}


int main(){
    string a,b; cin >> a >> b;
    vector<int> v1,v2;
    for(int i = a.length()-1; i >= 0; i--) v1.push_back(a[i]-'0');
    for(int i = b.length()-1; i >= 0; i--) v2.push_back(b[i]-'0');
    if(cmp(v1,v2)){
        auto v3 = sub(v1,v2);
        for(int i = v3.size()-1; i >= 0; i--) cout << v3[i];
    }else{
        cout << "-";
        auto v3 = sub(v2,v1);
        for(int i = v3.size()-1; i >= 0; i--) cout << v3[i];
    }
    return 0;
}

高精度乘法

#include <iostream>
#include <vector>
#include <cstring>
using namespace std;
const int maxn = 1e5 + 11;


// 11*12
//v1   11
//v2   21

//2 2
//  1  1
//2 3  1

vector<int> mul(vector<int>& v1,vector<int>& v2){ //v1*v2
    vector<int> v3(v1.size()+v2.size()+11,0);
    
    for(int i = 1; i < v2.size(); i++){
        for(int j = 1; j < v1.size(); j++){
            v3[i+j-1] += v1[j]*v2[i];
            if(v3[i+j-1] > 9){
                v3[i+j] += v3[i+j-1]/10;
                v3[i+j-1] = v3[i+j-1] % 10;
            }  
        }
    }
	//去前导0
	while(v3.size() > 2 && v3.back() == 0) v3.pop_back();
	return v3;
}

int main(){
    string a,b; cin >> a >> b;
    vector<int> v1,v2;
	//v1,v2的下标一定要从1开始,c[i+j-1] = a[i]*b[j]才成立
    v1.push_back(0);
    v2.push_back(0);
    for(int i = a.length()-1; i >= 0; i--) v1.push_back(a[i]-'0');
    for(int i = b.length()-1; i >= 0; i--) v2.push_back(b[i]-'0');
    vector<int> res = mul(v1,v2);

	for(int i = res.size()-1; i >= 1; i--) cout << res[i];
	cout << endl;

    return 0;
}

高精度除法

正着存放,[高位,低位]
不需要翻转,不需要个位存储在下标低的地方
a[maxn]存储被除数,
c[maxn]存储除数
b是除数
x是余数
在这里插入图片描述

#include <iostream>
#include <vector>
#include <deque>
using namespace std;

int x = 0; //余数
deque<int> div(vector<int>& a,int b){
	//a是被除数,b是除数
	deque<int> c(a.size()); //商集合
	for(int i = 0; i < a.size(); i++){
		c[i] = (x*10 + a[i]) / b;
		x = (x*10 + a[i]) % b;
	}
	while(c.size() > 1 && c.front() == 0) c.pop_front(); //注意清除的是前置0
	return c;
}

int main(){
	// s1 >= s2
	int b;
	string s1; cin >> s1 >> b;
	vector<int>a;
	for(int i = 0; i < s1.length(); i++) a.push_back(s1[i]-'0');

	deque<int> c = div(a,b);
	for(int i = 0; i < c.size(); i++) cout << c[i];
	cout << endl << x << endl;

	return 0;
}
posted @   超级氯化钾  阅读(62)  评论(5编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示