高精度加减乘除(非重载运算符

高精加

string add(string a,string b){
	int na[N] = {0},nb[N] = {0};
	string res;
	if(a.size() < b.size()) return add(b,a);
	int len = max(a.size(), b.size());
	for(int i = a.size();i > 0;i --) na[i] = a[a.size() - i] - '0';
	for(int i = b.size();i > 0;i --) nb[i] = b[b.size() - i] - '0';
	
	int t = 0;
	for(int i = 1;i <= len;i ++){
		na[i] += nb[i] + t;
		t = na[i] / 10;
		na[i] %= 10;
	}
	
	if(t) na[++len] = t;
	while(na[len] == 0)len --;
	for(int i = len;i > 0;i --) res += na[i] + '0';
	return res;	
}

高精减

只需要把大的放在前面就可以了
注意特判两数相等的情况(返回"0")

string sub(string a,string b){
    int na[N] = {0},nb[N] = {0},ans[N] = {0};
    string res;

    if((a < b && a.size() <= b.size()) || b.size() > a.size())
        return "-" + sub(b,a);

    for(int i = a.size();i > 0;i --) na[i] = a[a.size() - i] - '0';
    for(int i = b.size();i > 0;i --) nb[i] = b[b.size() - i] - '0';

    int maxl = max(a.size(),b.size());

    for(int i = 1;i <= maxl;i ++){
        if(na[i] < nb[i]){
            na[i + 1] --;
            na[i] += 10;
        }
        ans[i] = na[i] - nb[i];
    }

    while(ans[maxl] == 0) maxl --;
    if(maxl < 1) return "0";
    for(int i = maxl;i > 0;i --) res += ans[i] + '0';
    return res;
}

高精乘

大数乘小数

string mul(string a,int k){
	int na[N] = {0};
	string res;
	for(int i = a.size();i > 0;i --) na[i] = a[a.size() - i] - '0';
	
	int t = 0;
	for(int i = 1;i <= a.size();i ++){
		na[i] = na[i] * k + t;
		t = na[i] / 10;
		na[i] %= 10;
	}
	
	int len = a.size();
	if(t) na[++len] = t;
	for(int i = len;i > 0;i --) res += na[i] + '0';
	return res;
}

高精除

大数除小数

string div(string a,int k){
    string res;
    int na[N] = {0};
    for(int i = a.size();i > 0;i --) na[i] = a[i - 1] - '0';

    int t = 0;
    for(int i = 1;i <= a.size();i ++){
        t = t * 10 + na[i];
        na[i] = t / k;
        t %= k;
    }

    int len = a.size();
    while(na[len] == 0 && len > 1) len --;
    for(int i = len;i > 0;i --) res += na[i] + '0';
    return res;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值