高精度模板

声明

这篇文章的代码仅仅只是一个模板。

高精度加法

思想:和两数的加法类似(从小数位加加到大数位,),
在这里插入图片描述
一个数在数组里是倒着放,方便加法
性质:方便放

代码实现:

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

vector<int> add(vector<int>&A,vector<int>&B)
{
    vector<int> ret;
    int j=0;//进位
    int n=A.size();
    int m=B.size();
    for (int i = 0; i < n||i<m; i ++ )
    {
        if(i<n) j+=A[i];
        if(i<m) j+=B[i];
        ret.push_back(j%10);
        j/=10;
    }
    if(j) ret.push_back(j);  //如果两个数的最高位加起来大于10 则要放入进制位,
    return ret;
}
int main()
{
    string a,b;
    cin>>a,cin>>b;
    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=add(A,B);//auto 为c++11的语法,也可以写成vector<int> C=add(A,B);
    for(int i=C.size()-1;i>=0;i--) 
       printf("%d",C[i]);//逆序输出,得到两个大树的答案
    return 0;
}

高精度减法

和加法类似,只是需要注意前导0。 在这里插入图片描述

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

bool cmp(vector<int>& A,vector<int>& B)
{
    int n=A.size();
    int m=B.size();
    if(n!=m) return n>m;
    for(int i=n-1;i>=0;i--)
    {
        if(A[i]!=B[i]) return A[i]>B[i];
    } 
    return true;
}
vector<int> sub(vector<int>& A,vector<int>& B)
{    
//由于前面进行了比较,所以这里A的值固定比B的大
    vector<int> ret;
    int n=A.size();
    
    for (int i = 0,t=0; i < n; i ++ )
    {
        t=A[i]-t;
        if(i<B.size()) t-=B[i];
        ret.push_back((t+10)%10);
        if(t<0) t=1;
        else t=0;
    }
    while(ret.size()>1&&ret.back()==0) ret.pop_back();
    //删除前导0,两个数A和B的位数,且最高位数字一样,则会产生前导0;要删除掉
    return ret;
}
int main()
{
    string a,b;
    cin>>a>>b;
    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');
    if(cmp(A,B)){ //比较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<string>
#include<vector>
using namespace std;

vector<int> mul(vector<int>& A,int b)
{
    vector<int> C;
    int t=0;
    int n=A.size();
    for (int i = 0; i < n||t; i ++ )
    {
        if(i<n) t+=A[i]*b;
        C.push_back(t%10);
        t/=10;
    }
    while(C.size()>1&&C.back()==0) C.pop_back();
    return C;
}
int main()
{
    string a;
    int b;
    cin>>a>>b;
    vector<int> A;
    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;
}

高精乘高精

两个数组倒着,和高精*低精类似 ,自己接两个数组的每个数先相乘后的值放到ret数组对应的位置里,先不管进制,后面在进行O(N)的处理进制,

//高精*高精
#include<iostream>
#include<string>
#include<vector>
using namespace std;
vector<int> mul(vector<int>& A, vector<int>& B)
{
	vector<int> ret(A.size()+B.size());
	for (int i = 0; i < A.size() ; i++)
		for (int j = 0; j < B.size(); j++)
			ret[i + j] = A[i] * B[j];

	int t = 0;
	for (int i = 0; i < ret.size() - 1; i++)
	{
		t += ret[i];
		ret[i] = t % 10;
		t /= 10;
	}
	
	while (ret.size() > 1 && ret.back() == 0) ret.pop_back(); //删除前导0 
	return ret;
}
int main()
{
	string a, b;
	cin >> a >> b;
	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--)
	{
		printf("%d", C[i]);
	}
	return 0;
}

高精度除法

高精度/低精度

注意这次的A是由高为传输至低位,由于在除法的手算过程中,发现从高位进行处理,

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

vector<int> mul(vector<int>& A, int b)
{
	vector<int> ret;
	int r = 0;//r表示余数
	//由最高位进行处理
	for (int i = 0; i < A.size(); i++)
	{
		//将上次的余数*10在加上当前位的数字,便是该位需要除的被除数
		r = r * 10 + A[i];
		//所得即为商在这一位的数字
		ret.push_back(r / b); 
		r %= b;
	}
	//删除前面的0
	reverse(ret.begin(), ret.end());
	while (ret.size() > 1 && ret.back() == 0) ret.pop_back();
	return ret;
}
int main()
{
	string a;
	int b;
	cin >> a >> b;
	vector<int> A;
	for (int i = 0; i < a.size(); 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;

}

高精/高精
参考此链接参考此链接

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值