高精度算法(加,减,乘)

1.高精度加法
A+B问题
思路:
1.字符串输入
2.反向装入整型数组中
3.每位相加(注意进位)
4.反向输出

#include<iostream>
#include<algorithm> 
#include<cstring>
using namespace std;
string A;
string B;
int C[1000001],a[1000001],b[1000001];
int main(){
	cin>>A>>B;
	int la=A.length();
	int lb=B.length();
	for(int i=0;i<la;i++){//将字符转为整数反转存到整型数组a[]中
		a[la-i]=A[i]-'0';
	}
	for(int i=0;i<lb;i++){//将字符转为整数反转存到整型数组b[]中
		b[lb-i]=B[i]-'0';
	}
	int lc=max(la,lb);//以比较长的数为界,短的数用0补齐(实际上定义全局变量数组是就有这个效果了)
	int k=0;
	/*下面这段另一种写法
	for(int i=1;i<=lc;i++){
		c[i]+=a[i]+b[i];
		c[i+1]=(a[i]+b[i])/10;
		c[i]%10; 
	}
	if(c[lc+1]>0){//进位
	    len_max++;
	}*/
	for(int i=1;i<=lc;i++){
		C[i]=(a[i]+b[i]+k)%10;//进位
		k=(a[i]+b[i]+k)/10;
	}
	if(k){//进位
	    cout<<1;
	}	
	for(int i=lc;i>=1;i--){//反向输出
		cout<<C[i]; 
	}
	return 0;
} 

2.高精度减法
A-B问题
思路:
1.字符串输入
2.判断两数大小,保证大数在前,是负数首先输出符号
3.反向装入整型数组中
4.每位相减(注意借位)
5.去除前导零(最少留一个0)
6.反向输出

#include<iostream>
#include<algorithm> 
#include<string>
using namespace std;
string A;
string B;
int c[1000001],a[1000001],b[1000001];
int main(){
	cin>>A>>B;
	int la=A.length();
	int lb=B.length();
	if(la<lb||la==lb&&A<B){//当A<B时候要交换两个数,首先比较长度,长度相等比较字典序 
	swap(A,B);
	swap(la,lb);
	cout<<'-';//小于就输出符号 
	}
	for(int i=0;i<la;i++){
		a[la-i]=A[i]-'0';
	}
	for(int i=0;i<lb;i++){
		b[lb-i]=B[i]-'0';
	}
	int lc=la;
	for(int i=1;i<=lc;i++){
		if(a[i]<b[i]){//借位 
			a[i]+=10;
			a[i+1]--;
		}
		c[i]=a[i]-b[i];
	}
	while(c[lc]==0&&lc>1)lc--;//消除前导零,注意当A==B时要留一个 
	for(int i=lc;i>=1;i--){
		cout<<c[i]; 
	}
	return 0;
} 

3.高精度乘法
A*B问题
思路:
1.字符串输入
2.反向装入整型数组中
3.交叉相乘(双重循环)
5.去除前导零(最少留一个0)
4.反向输出

#include<iostream>
#include<string>
using namespace std;
string x,y;
int a[100005],b[100005],c[100005];
int main(){
	cin>>x>>y;
	int la=x.length();
	int lb=y.length();
	for(int i=0;i<la;i++){
		a[la-i]=x[i]-'0';
	}
	for(int i=0;i<lb;i++){
		b[lb-i]=y[i]-'0';
	}
	for(int i=1;i<=la;i++){
		for(int j=1;j<=lb;j++){
			c[i+j-1]+=a[i]*b[j];//交叉想乘
			c[i+j]+=c[i+j-1]/10;
			c[i+j-1]%=10;
		}
	}
	int lc=la+lb;
	while(c[lc]==0&&lc>1)lc--;//去前导零
	for(int i=lc;i>=1;i--){
		cout<<c[i];
	}
	return 0;
} 
发布了160 篇原创文章 · 获赞 13 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/Anterior_condyle/article/details/104843202
今日推荐