算法笔记1-高精度模板(加减乘除)个人模板

目录

加法

减法

乘法

​编辑

除法


加法

#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath> 
#include <queue>

using namespace std;

typedef pair<int,int> PII;

const int N = 1e5 + 10;

int n;
int a[N],b[N],c[N];
bool st[10];



void solve()
{
    string sa,sb;
    cin >> sa >> sb;
    int la = sa.size(),lb = sb.size();
    for(int i = la - 1,j = 1; i >= 0; i --, j ++)
    {
        a[j] = sa[i] - '0';
    }
    for(int i = lb - 1, j = 1; i >= 0; i --, j ++)
    {
        b[j] = sb[i] - '0';
    }
    int lc = max(la,lb);
    int st = 0;
    int k = 1;
    for(int i = 1; i <= lc; i ++, k ++)
    {
        c[k] = a[i] + b[i] + st;
        if(c[k] >= 10)
        {
            st = 1;
            c[k] = c[k] % 10;
        }
        else
        {
            st = 0;
        }
    }
    if(st)
    {
        cout << st;
    }
    for(int i = k-1; i >= 1; i --)
    {
        cout << c[i];
    }
    // cout << k;
}

int main()
{
    solve();
    return 0;
}

 https://www.luogu.com.cn/problem/P1601

模板

 

#include <iostream>
#include <vector>
using namespace std;
vector<int> add(vector<int> &A, vector<int> &B)
{
    //为了方便计算,让A中保存较长的数字, B中保存较短的数字
    if (A.size() < B.size()) return add(B, A);
    //保存结果的数组
    vector<int> C;
    //进位,开始时是0
    int t = 0;
    //依次计算每一位
    for (int i = 0; i < A.size(); i ++ )
    {
        t += A[i];//加上 A 的第 i 位上的数字
        if (i < B.size()) t += B[i];//加上 B 的第 i 位上的数字
        C.push_back(t % 10); //C 中放入结果
        t /= 10;//t 更新成进位
    }
    //最后如果进位上有数,放进结果数组
    if (t) C.push_back(t);
    return C;//返回结果
}

int main()
{
    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 -- ) cout << C[i];//倒序输出C中的数字
    cout << endl;
    return 0;
}

减法

#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath> 
#include <queue>

using namespace std;

typedef pair<int,int> PII;

const int N = 1e5 + 10;

int n;
int a[N],b[N],c[N];
bool st[10];
string sa,sb;

bool cmp(string x,string y)
{
    if(x.size() != y.size()) return x.size() > y.size();
    
	for(int i = 0; i < x.size(); i ++)
	{
		if(x[i] > y[i])
		{
			return true;
		}
		else if(x[i] < y[i]){
			return false;
		}
	}
	return false;
}
void solve()
{
	string a1,b1;
	cin >> a1 >> b1;
	
	bool flag = false;
	if(cmp(a1,b1))
	{
		sa = a1;
		sb = b1;
		flag = true;
	}
	else{
		sa = b1,sb = a1;
	}
	
	int la = sa.size(),lb = sb.size();
	for(int i = la - 1,j = 1; i >= 0; i --, j ++)
	{
		a[j] = sa[i] - '0';
	}
	for(int i = lb - 1, j = 1; i >= 0; i --, j ++)
	{
		b[j] = sb[i] - '0';
	}
	
	int k = 1;
	int st = 0;
	
	for(int i = 1; i <= la; i ++,k ++)
	{
		c[k] = a[i] - b[i] - st;
		
		if(c[k] < 0)
		{
			c[k] = a[i] + 10 - b[i] - st;
			st = 1;
		}
		else st = 0;
	}
	while(1 && k)
	{
		if(!c[k-1]) k --;
		else break;
	}
	if(!flag && k != 0) cout << "-";
	
	for(int i = k-1; i >= 1; i --)
	{
	    cout << c[i];
	}
	
	if(k == 0) cout << k;
	
}

int main()
{
    solve();
    return 0;
}

https://www.luogu.com.cn/record/159830019

乘法

//大数乘小数
#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++)
    {
        if(i<A.size())t+=A[i]*b;
        C.push_back(t%10);
        t/=10;
    }
    return C;
}

int main()
{
    string a;
    int b;
    cin>>a>>b;
    if(b == 0){ 
        cout << 0; 
        return 0;
    }
    vector<int>A;

    for(int i=a.size()-1;i>=0;i--)A.push_back(a[i]-'0');

    auto C=mul(A,b);
    
    bool is_first = false;
    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, vector<int> &B) {
    vector<int> C(A.size() + B.size() + 7, 0); // 初始化为 0,C的size可以大一点

    for (int i = 0; i < A.size(); i++)
        for (int j = 0; j < B.size(); j++)
            C[i + j] += A[i] * B[j];

    int t = 0;
    for (int i = 0; i < C.size(); i++) { // i = C.size() - 1时 t 一定小于 10
        t += C[i];
        C[i] = t % 10;
        t /= 10;
    }

    while (C.size() > 1 && C.back() == 0) C.pop_back(); // 必须要去前导 0,因为最高位很可能是 0
    return C;
}

int main() {
    string a, b;
    cin >> a >> b; // a = "1222323", b = "2323423423"

    vector<int> 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 = mul(A, B);

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

    return 0;
}
*/

 https://www.luogu.com.cn/problem/P1303

除法

#include <iostream>
#include <vector>
#include <algorithm>

typedef long long ll;

using namespace std;

vector <ll> div(vector <ll> &A,ll b,ll &r){ // 取r的地址符,是为了更改r的值,方便后面输出余数
    vector <ll> C; // 答案
    r = 0; // 余数
    for(int i = A.size() - 1;i >= 0;i --){ // 从最高位开始处理
        r = r * 10 + A[i]; // 上一次的余数乘10,再加上当前位上的数,就是被除数
        C.push_back(r / b); // 往C里压入这个被除数除b
        r %= b; // 计算余数
    }
    reverse(C.begin(),C.end()); // 因为除法运算中从高位开始计算,而前导0都在顶部而不是底部,所以要翻转过来
    while (C.size() > 1 && C.back() == 0) C.pop_back(); // 去除前导0
    return C; // 返回答案
}
int main(){
    string a;
    long long b;
    cin>>a>>b;
    vector <ll> A;
    for(int i = a.size() - 1;i >= 0;i --) A.push_back(a[i] - '0'); // 倒序
    ll r;
    auto C = div(A,b,r); // 答案
    for(int i = C.size() - 1;i >= 0;i --) cout<<C[i];
    return 0;
}

https://www.luogu.com.cn/problem/P1480

  • 9
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值