高精度(加减乘除)C++

  1. 高精加

#include <bits/stdc++.h>
using namespace std;

//
	const int maxn = 100005;
	char a[maxn]={0};
	char b[maxn]={0};
	int res[maxn] = {0};
//
void add(char *a,char *b)
{
	int lena = strlen(a);
	int lenb = strlen(b);
	reverse(a,a+lena);
	reverse(b,b+lenb);
	int len = max(lena,lenb);
	for(int i=0;i<len;++i)
	{
		res[i] += (i>=lena?0:a[i]-'0') + (i>=lenb?0:b[i]-'0');
		if(res[i] >= 10)
		{
			res[i+1]+=res[i]/10;
			res[i]%=10;
		}
	}
	if(res[len] > 0) printf("%d",res[len]);
	for(int i=len-1;i>=0;--i)
		printf("%d",res[i]);
	printf("\n");	
}
int main()
{
	scanf("%s%s",a,b);
	printf("%s\n%s\n",a,b);
	add(a,b);
	return 0;
}

vector版:

#include <iostream>
#include <vector>

using namespace std;

vector<int> add(vector<int>& a,vector<int>& b)
{
	if(a.size() < b.size()) return add(b,a);
	vector<int> c;
	int t = 0;
	for(int i=0;i<a.size();++i)
	{
		t+=a[i];
		if(i<b.size()) t+=b[i];
		c.push_back(t%10);
		t/=10;
	}
	if(t) c.push_back(t);
	return c;
}

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 = add(A,B);
	for(int i=C.size()-1;i>=0;--i)
		printf("%d",C[i]);
}

  1. 高精减

#include<bits/stdc++.h>
using namespace std;

const int maxn = 100005;
char a[maxn];
char b[maxn];
int res[maxn]={0};
void sub(char * a, char * b)
{
    memset(res,0,sizeof(res));
    int lena = strlen(a);
    int lenb = strlen(b);
    reverse(a,a+lena);
    reverse(b,b+lenb);

    if(strlen(a) < strlen(b))
    {
        printf("-");
        swap(a,b);
    }
    if(strlen(a) == strlen(b))
    {
        for(int i=lena-1;i>=0;i--)
        {
            if(b[i] < a[i]) break;
            if(b[i] == a[i]) continue;
            if(b[i] > a[i])
            {
                printf("-");
                swap(a,b);
                break;
            }
        }
    }
    int len = max(lena,lenb);
    for(int i=0;i<len;i++)
    {
        res[i] += a[i] ? a[i] - '0' : 0 ;
        res[i] -= b[i] ? b[i] - '0' : 0 ;
        if(res[i] < 0)
        {
            res[i+1] -= 1;
            res[i] += 10;
        }
    }
    while(res[len-1] == 0 && len > 1) --len;
    if(len == 1)
    {
        printf("0");
        return;
    }
    for(int i=len-1;i>=0;--i)
        printf("%d",res[i]);
}

int main()
{
    scanf("%s%s",a,b);
    sub(a,b);
    return 0;
}
  1. 高精乘

高精乘以int

#include <bits/stdc++.h>
using namespace std;

vector<int> mul(vector<int>& a,int b)
{
	int lena = a.size();
	//int lenb = log10(b)+1;
	vector<int> re;
	int t=0;
	for(int i=0;i<lena;i++)
	{
		t += a[i] * b;
		re.push_back(t%10);
		t/=10;
	}
	while(t)
	{
		re.push_back(t%10);
		t/=10;
	}
	while(re.size() > 1 && re.back() == 0) 
		re.pop_back();
	return re;	
}

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 re = mul(a,b);
	for(int i=re.size()-1;i>=0;--i)
		printf("%d",re[i]);
	return 0;
}


高精乘以高精

#include <bits/stdc++.h>
using namespace std;

vector<int> mul(vector<int>& a,vector<int>& b)
{
	int lena = a.size();
	int lenb = b.size();
	if(lena<lenb) return mul(b,a);
	vector<int> re(lena+lenb,0); 
	for(int i=0;i<lena;i++)
	{
		for(int j=0;j<lenb;j++)
		{
			re[i+j] += a[i]*b[j];
		}
	}
	for(int i=0;i<re.size()-1;i++)
	{
		re[i+1] += re[i] / 10;
		re[i] %= 10;
	}
	int t = re.back();
	re.back() = t%10;
	t/=10; 
	while(t)
	{
		re.push_back(t%10);
		t/=10; 
	}
	while(re.size() > 1 && re.back() == 0) 
		re.pop_back();
	return re;	
}

int main()
{
	string A;
	string 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 re = mul(a,b);
	for(int i=re.size()-1;i>=0;--i)
		printf("%d",re[i]);
	return 0;
}

  1. 高精除

高精除以高精还没写 ,面是高精除以int版本

#include <bits/stdc++.h>
using namespace std;

vector<int> div(vector<int>& a,int b,int& yu)
{
    vector<int> re;
    int r=0; //余数
    for(int i=0;i<a.size();++i)
    {
        if(r < b) r = r * 10 + a[i];
        re.push_back(r/b);
        r %= b;
    }
    yu = r;
    while(re.size() > 1 && *re.begin() == 0) re.erase(re.begin());
    return re;
}

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'); //正序存放 

    int yu=0;
    auto C = div(a,b,yu);
    for(int& i : C)
        printf("%d",i);
    printf("\n%d",yu);
    return 0;
}
/*
1≤A的长度≤100000,
1≤B≤10000
B 一定不为0
*/
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值