当前位置 博文首页 > pzjdsg666的博客:C++:高精度算法

    pzjdsg666的博客:C++:高精度算法

    作者:[db:作者] 时间:2021-06-18 09:12

    1、加法

    #include<bits/stdc++.h>
    using namespace std;
    int compare(string str1,string str2){
        if(str1.length()>str2.length())
    		return 1;
        else if(str1.length()<str2.length())
    		return -1;
        else return str1.compare(str2);
    }
    string add(string str1,string str2){
        string str;
        int len1=str1.length(),len2=str2.length();
        if(len1<len2){
            for(int i=1;i<=len2-len1;i++)
               str1="0"+str1;
        } else{
            for(int i=1;i<=len1-len2;i++)
               str2="0"+str2;
        }
        len1=str1.length();
        int cf=0,temp;
        for(int i=len1-1;i>=0;i--){
            temp=str1[i]-'0'+str2[i]-'0'+cf;
            cf=temp/10;
            temp%=10;
            str=char(temp+'0')+str;
        }
        if(cf!=0)
    		str=char(cf+'0')+str;
        return str;
    }
    string str1,str2;
    int main(){
        cin>>str1>>str2;
        cout<<add(str1,str2)<<endl;
        return 0;
    }

    2、减法

    #include<bits/stdc++.h>
    using namespace std;
    int compare(string s1,string s2){
      	if(s1.length()>s2.length())
    	  	return 0;
      	if(s1.length()<s2.length())
    	  	return 1;
      	for(int i=0;i<=s1.length();i++){
        if(s1[i]>s2[i])
    		return 0;
        if(s1[i]<s2[i])
    		return 1;
      	}
      	return 0;
    }
    string str1,str2;
    int a[250],b[250],i;
    int main(){
    	cin>>str1>>str2;
      	a[0]=str1.length();
      	for(i=1;i<=a[0];i++)
        	a[i]=str1[a[0]-i]-'0';
     	b[0]=str2.length();
      	for(i=1;i<=b[0];i++)
        	b[i]=str2[b[0]-i]-'0';
      	if((compare(str1,str2))==0){
        	for(i=1;i<=a[0];i++){
    			a[i]-=b[i];
           		if(a[i]<0) {
    		 	  	a[i+1]--;
    				a[i]+=10;
    			}
        	}
        	a[0]++;
        	while((a[a[0]]==0)&&(a[0]>1))
    			a[0]--;
        	for(i=a[0];i>=1;i--)
        	  	cout<<a[i];
        	cout<<endl;
      	}else{
        	cout<<'-';
        	for(i=1;i<=b[0];i++){
    			b[i]-=a[i];
           		if(b[i]<0){
    			   b[i+1]--;
    			   b[i]+=10;
    			}
        	}
        	b[0]++;
        	while((b[b[0]]==0)&&(b[0]>1))
    			b[0]--;
        	for(i=b[0];i>=1;i--)
          		cout<<b[i];
        	cout<<endl;
      	}
      	return 0;
    }

    3、乘法

    #include<bits/stdc++.h>
    using namespace std;
    string str1,str2;
    int a[250],b[250],c[500],len,i,j;
    int main(){
      	cin>>str1>>str2;
      	a[0]=str1.length();
      	for(i=1;i<=a[0];i++)
        	a[i]=str1[a[0]-i]-'0';
      	b[0]=str2.length();
      	for(i=1;i<=b[0];i++)
        	b[i]=str2[b[0]-i]-'0';
      	for(i=1;i<=a[0];i++){
        	for(j=1;j<=b[0];j++){
        		c[i+j-1]+=a[i]*b[j];
        		c[i+j]+=c[i+j-1]/10;
        		c[i+j-1]%=10;
        	}
        }
      	len=a[0]+b[0]+1;
      	while((c[len]==0)&&(len>1))
    	  	len--;
      	for(i=len;i>=1;i--)
        	cout<<c[i];
      	return 0;
    }

    4、除法

    #include<bits/stdc++.h>
    using namespace std;
    int a[100],b[100],c[100];
    int compare(int a[],int b[]){
        int i;
        if(a[0]>b[0])
            return 1;
        if(a[0]<b[0])
            return -1;
        for(i=a[0];i>0;i--){
            if(a[i]>b[i])
                return 1;
            if(a[i]<b[i])
                return -1;
        }
        return 0;
    }
    void subduction(int a[],int b[]){
        int flag,i;
        flag=compare(a,b);
        if(flag==0){
            a[0]=0;
            return;
        }
        if(flag==1){
            for(i=1;i<=a[0];i++){
                if(a[i]<b[i]){
                    a[i+1]--;
                    a[i]+=10;
                }
                a[i]-=b[i];
            }
            while(a[0]>0&&a[a[0]]==0)
                a[0]--;
            return;
        }
    }
    char str1[100],str2[100];
    int i,j;
    int main(){
        cin>>str1>>str2;
        a[0]=strlen(str1),b[0]=strlen(str2);
        for(i=1;i<=a[0];i++)
            a[i]=str1[a[0]-i]-'0';
        for(i=1;i<=b[0];i++)
            b[i]=str2[b[0]-i]-'0';
        int temp[100];
        c[0]=a[0]-b[0]+1;
        for(i=c[0];i>0;i--){
            memset(temp,0,sizeof(temp));
            for(j=1;j<=b[0];j++)
                temp[j+i-1]=b[j];
            temp[0]=b[0]+i-1;
            while(compare(a,temp)>=0){
                c[i]++;
                subduction(a,temp);
            }
        }
        while(c[0]>0&&c[c[0]]==0)
            c[0]--;
        if(c[0]==0)
            cout<<0<<endl;
        else{
            for(i=c[0];i>0;i--)
                cout<<c[i];
            cout<<endl;
        }
        return 0;
    }

    特此说明:低精也可以用高精来存!!!

    最后,请大家一键三连!!!

    下一篇:没有了