算法与数据结构---高精度

前言

          本文章为观看以下视频所写。

视频链接:高精度算法-加法_哔哩哔哩_bilibili

一、高精度加法 

        无论整型还是浮点型或者是long long类型可计算数据都是有限位,如何来计算指定位数的数据的加减乘除呢?这就利用到了string类型。

高精度+高精度

#include 
#include 
using namespace std;
string s1,s2/*高精度数值*/ ;
int a[101]/*s1的进制转换*/,b[101]/*s2的进制转换*/;
int c[101]/*高精度a和高精度b之和*/;
void strtoint(string src,int des[]){
	for(int i=0;i>s1>>s2;
   //1、个位对齐-反转,字符转整型 
   strtoint(s1,a);
   strtoint(s2,b);
   int la=s1.size(),lb=s2.size();
   //2、计算c数组长度,按最长数位算
   int lc=max(la,lb)+1;
   //3、对位相加得出c数组
   for(int i=1;i<=lc;i++){
   	   c[i]=a[i]+b[i]+c[i];//当前位数字再加进位的数字(注意)
   	   c[i+1]=c[i]/10;//进位 
   	   c[i]%=10;//保留个位 
   } 
   //4、去除前导0 
   while(c[lc]==0&&lc>1){
   	lc--;
   }
   //5、倒序打印 
   for(int i=lc;i>=1;i--){
   	cout<

 二、高精度减法

高精度-高精度

#include 
#include 
using namespace std;
string s1,s2/*高精度数值*/ ;
int a[101]/*s1的进制转换*/,b[101]/*s2的进制转换*/;
int c[101]/*高精度a和高精度b之差*/;
void strtoint(string src,int des[]){
	for(int i=0;i=str2.size();
	else
	   return str1>=str2;
} 
int main() {
   cin>>s1>>s2;
   if(!cmpstr(s1,s2)){
   	  swap(s1,s2);
   	  cout<<'-';
   }
   int la=s1.size(),lb=s2.size();
   strtoint(s1,a);
   strtoint(s2,b);
   int lc=max(la,lb);
   for(int i=1;i<=lc;i++){
   	if(a[i]>=b[i])   //注意等号的划分,a[i]=b[i]时,也可以直接相减,划分到这里,如果没加=,划分到else里面,就可能导致死循环或结果不正确,千万注意 
   	   c[i]=a[i]-b[i];
   	else{            //不够减 
   	   c[i]=10+a[i]-b[i];
   	   a[i+1]--;
	   }   
   }
   while(c[lc]==0&&lc>1)
        lc--; 
    for(int i=lc;i>=1;i--){
    	cout<

三、高精度乘法

高精度*高精度

#include 
#include 
using namespace std;
string s1,s2;
int a[501],b[501],c[501];
void strtoint(string s,int x[]){
	for(int i=0;i>s1>>s2;
	strtoint(s1,a);
	strtoint(s2,b);
	int la=s1.size();
	int lb=s2.size();
	int lc=la+lb;
	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];   //高精度加法 
		    c[i+j-1]%=10;               //高精度加法 
		}
	}
	while(c[lc]==0&&lc>1) lc--;
	for(int i=lc;i>=1;i--){
		cout<

四、高精度除法

高精度/低精度

#include 
using namespace std;
//高精度除法(高精度/低精度)
string s;
int a[501]/*高精度*/,c[501]/*结果高精度*/;
long long b;//低精度 
int tmp;//余数 
void strtoint(string s,int x[]){
	for(int i=0;i>s>>b;
    int la=s.size();
    strtoint(s,a);
    for(int i=1;i<=la;i++){
    	c[i]=(a[i]+tmp*10)/b;
    	tmp=(a[i]+tmp*10)%b;
	}
	int lc=1;
	while(c[lc]==0&&lc

高精度/高精度

方法:用减法来模拟除法

算法与数据结构---高精度_第1张图片

 

#include 
using namespace std;
//高精度除法(高精度/高精度)
string s1,s2;
int a[101],b[101],c[101],temp[101];
int la,lb,lc,lt;
void strtoint(string s,int x[]){
	for(int i=0;iLT){
		return 1; 
	}
	else if(LA=1;i--){
			if(A[i]>TEMP[i]){
				return 1;
			}
			if(A[i]=TEMP[i]){   //注意等于号, A[i]>=TEMP[i]的时候也可以直接减,如果没加=划分到else里面就糟糕了,可能死循环了 
			A[i]-=TEMP[i];
		}
		else{
			A[i]+=(10-TEMP[i]);
			 A[i+1]--;  
		}	
	} 
	while(A[LA]==0&&LA>1) LA--;
}
int main() {
    cin>>s1>>s2;
    la=s1.size();
    lb=s2.size();
    strtoint(s1,a);
    strtoint(s2,b);
    lc=la-lb+1;
    for(int i=lc;i>=1;i--){
    	//每次向右移动i位 
    	lt=move(b,temp,lb,i-1);
    	while(cmp(a,temp,la,lt)>=0){
    		c[i]++;
    	//高精度减法
		sub(a,temp,la);	
		}
		la--;    //减不动la--,下次循环时 la位数少一个0 ,然后再看可以减多少个temp 
		//la--不影响lc,lc已经被赋值成了la-lb+1,是个固定的数值。 
	}
	while(c[lc]==0&&lc>1){
		lc--;
	}
	for(int i=lc;i>=1;i--){
		cout<

你可能感兴趣的:(算法与数据结构,算法,数据结构,c++,学习,蓝桥杯)