高精度乘法

目录

乘法的竖式

第一次

第二次

正确的一次


大家还好吗?我又双叒叕来写高精度了!

乘法的竖式

其实我调过两次的,都失败了

第一次

算第a位,一定是第x+a-x+1(0\leqslant a\leqslant字符串长度)

于是我便开始干,结果……算出来不知道啥东西

11\times100=0???

………………

第二次

其实就是竖式的算法,但有一个地方ji搞错了

      12

\times    33

————

      36

    36

————

    396

于是………………

999\times999=1109001???

………………

正确的一次

其实我知道1109001其实是9991111

正解是998001也就是8991111

那多出来的一千是哪儿来的

原来,我这块写错了

 经过修改

整个模板长这个样(其他也有修改的,可以看一看)

#include<bits/stdc++.h>
using namespace std;
namespace high_pre{
	typedef string high_pre_num;
	void minus_zero(high_pre_num &a){
		bool s=0;
		if(a[a.size()-1]=='-'){
			s=1;
			a.pop_back();
		}
		while(a.size()>1&&a[a.size()-1]=='0')
		    a.pop_back();
		if(s){
			if(a=="0")
			    return;
			else
			    a+='-';
		}
	}
	high_pre_num input(){//输入 
		high_pre_num a="";
		cin>>a;
		reverse(a.begin(),a.end());
		minus_zero(a);
		return a;
	}
	high_pre_num init(string x){//定义(等于a=……) 
		high_pre_num a="";
		reverse(x.begin(),x.end());
		minus_zero(x);
		a=x;
		return a;
	}
	void output(high_pre_num a){//输出 
	    minus_zero(a);
		reverse(a.begin(),a.end());
		cout<<a;
	}
	bool greater(high_pre_num a,high_pre_num b){//大于 
		if(a[a.size()-1]!='-'&&b[b.size()-1]!='-'){
			if(a.size()>b.size())
			    return true;
			if(a.size()<b.size())
			    return false;
			else{
				for(int i=0;i<a.size();i++)
					if(a[i]>b[i]) return true;
				return false;
			}
		}
		else if(a[a.size()-1]=='-'&&b[b.size()-1]=='-'){
			if(a.size()>b.size())
			    return true;
			if(a.size()<b.size())
			    return false;
			else{
				for(int i=1;i<a.size();i++){
					if(a[i]>b[i]) return true;
					if(a[i]<b[i]) return false;
				}
				return false;
			}
		}
		else if(a[a.size()-1]=='-'&&b[b.size()-1]!='-')
		    return false;
		else
		    return true;
	}
	bool less(high_pre_num a,high_pre_num b){//小于 
	    return greater(b,a);
	}
	bool equals(high_pre_num a,high_pre_num b){//等于 
		if(greater(a,b))
		    return false;
		else if(less(a,b))
		    return false;
		return true;
	}
	high_pre_num minus(high_pre_num a){//等于平时我们用的-a(a为一个变量) 
		if(a[a.size()-1]=='-')
		    a.pop_back();
		else
		    a+='-';
		return a;
	}
	bool is_minus(high_pre_num a){
		return (a[a.size()-1]=='-');
	}
	high_pre_num add(high_pre_num a,high_pre_num b){//加法 
		high_pre_num s="";
		if(a[a.size()-1]=='-'&&b[b.size()-1]!='-'){
			a.pop_back();
			swap(a,b);
			bool k=0;
			if(less(a,b))
		    	swap(a,b),k=1;
			high_pre_num s="";
			int x=0,l=0;
			int lll=max(a.size(),b.size());
			for(int i=0;i<lll;i++){
				b+='0';
				a+='0';
		    	l=a[i]-'0'-b[i]+'0'-x;
		    	x=0;
		    	if(l<0){
		    		x++;
		    		l+=10;
				}
				char xx=(l+'0');
				s+=xx;
			}
			if(k)
		    	s+='-';
			return s;
		}
		if(a[a.size()-1]!='-'&&b[b.size()-1]=='-'){
			b.pop_back();
			bool k=0;
			if(less(a,b))
		    	swap(a,b),k=1;
			high_pre_num s="";
			int x=0,l=0;
			int lll=max(a.size(),b.size());
			for(int i=0;i<lll;i++){
				b+='0';
				a+='0';
		    	l=a[i]-'0'-b[i]+'0'-x;
		    	x=0;
		    	if(l<0){
		    		x++;
		    		l+=10;
				}
				char xx=(l+'0');
				s+=xx;
			}
			if(k)
		    	s+='-';
			return s;
		}
		bool k=0;
		if(a[a.size()-1]=='-'&&b[b.size()-1]=='-'){
			b.pop_back();
			a.pop_back();
			k=1;
		}
		int x=0,l=0;
		int lll=max(a.size(),b.size());
		for(int i=0;i<=lll;i++){
			b+='0';
			a+='0';
		    l=a[i]-'0'+b[i]-'0'+x;
		    if(l==0&&i==lll)<%
			    break;
			%>
		    x=0;
		    if(l>=10){
		    	x+=l/10;
		    	l%=10;
			}
			char xx=(l+'0');
			s+=xx;
		}
		if(k)
		    s+='-';
		return s;
	}
	high_pre_num sub(high_pre_num a,high_pre_num b){//减法 
		if(a[a.size()-1]=='-'&&b[b.size()-1]!='-'){//被减数是负数时 
			a.pop_back();
			return add(a,b)+'-';
		}
		if(a[a.size()-1]!='-'&&b[b.size()-1]=='-'){//减数是负数时 
			b.pop_back();
			return add(a,b);
		}
		bool nnn=0;
		if(a[a.size()-1]=='-'&&b[b.size()-1]=='-'){//两个都是负数时 
			b.pop_back();
			a.pop_back();
			nnn=1;
		}
		bool k=0;
		if(less(a,b))//是负数 
		    swap(a,b),k=1;
		high_pre_num s="";
		int x=0,l=0;
		int lll=max(a.size(),b.size());
		for(int i=0;i<lll;i++){
			b+='0';
			a+='0';
		    l=a[i]-'0'-b[i]+'0'-x;
		    x=0;
		    if(l<0){
		    	x++;
		    	l+=10;
			}
			char xx=(l+'0');
			s+=xx;
		}
		if(k)//特判 
		    s+='-';
	    if(nnn)//特判 
		    s=minus(s); 
		return s;
	}
	int hpntoi(high_pre_num a){//转化为int(有个前提,不爆int)
	    minus_zero(a); 
		reverse(a.begin(),a.end());
		return stoi(a);
	}
	long long hpntoll(high_pre_num a){//转化为long long(有个前提,不爆long long)
	    minus_zero(a); 
		reverse(a.begin(),a.end());
		return stoll(a);
	}
	long hpntol(high_pre_num a){//转化为long(有个前提,不爆long) 
	    minus_zero(a);
		reverse(a.begin(),a.end());
		return stol(a);
	}
	high_pre_num mult(high_pre_num a,high_pre_num b){//乘法 
	    if(is_minus(a)&&is_minus(b)){
	    	a.pop_back();
	    	b.pop_back();
		}
		bool k=0;
		if(is_minus(a)&&(!is_minus(b))){
			k=1;
			a.pop_back();
		}
		if(is_minus(b)&&(!is_minus(a))){
			k=1;
			b.pop_back();
		}
		high_pre_num s="";
		int x=0,l=0;
		int xxx=b.size();
		b+='0'; 
		for(int i=0;i<a.size();i++){
			high_pre_num ll="";
			for(int j=1;j<=i;j++)
			    ll+='0';
			x=0;
			for(int j=0;j<=xxx;j++){
				l=(a[i]-'0')*(b[j]-'0')+x;
				if(l>9){
					x=l/10;
					l%=10;
				}
				ll+=(l+'0');
			}
			s=add(s,ll);
		}
		if(k)
		    s+='-';
		return s;
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值