• 高精度运算 【加法】【减法】


    高精度算是我高中期间没有学明白的知识点之一,其实挺简单的东西。核心思路是【按位模拟竖式运算】,说白了就是模拟题。

    加法减法从低位到高位模拟,因为会进位借位

    乘法也从低到高因为进位

    除法要从高到低因为我们手算除法时也是从高到低保留余数的。

    高精度减法:https://www.luogu.org/problemnew/show/P2142

     1 #include<iostream>
     2 using namespace std;
     3 
     4 string a1,b1;
     5 int a[10005],b[10005],temp[10005];//由低位到高位 
     6 int ans[10005];
     7 bool biga=false,bigb=false;
     8 
     9 int main(){
    10     cin>>a1>>b1;
    11     for(int i=0;i<a1.length();i++) a[a1.length()-i] =int(a1[i])-48;    
    12     for(int i=0;i<b1.length();i++) b[b1.length()-i] = int(b1[i])-48;
    13     
    14     if(a1.length()>b1.length()) biga=true;
    15     else if(b1.length()>a1.length()) bigb=true;
    16     else{
    17         for(int i=a1.length();i>=1;i--){
    18             if( a[i]>b[i] ) { biga=true; break; }
    19             else if( b[i]>a[i] ) { bigb=true; break; }
    20         }
    21         if(!biga && !bigb) { cout<<0; return 0; }
    22     }
    23     int length=max(a1.length(),b1.length());//要考虑这么多上下相减
    24     
    25     if(bigb){
    26         for(int i=1;i<=length;i++) temp[i]=a[i];
    27         for(int i=1;i<=length;i++) a[i]=b[i];
    28         for(int i=1;i<=length;i++) b[i]=temp[i];
    29     }
    30         
    31     for(int i=1;i<=length;i++){
    32         ans[i] += a[i]-b[i];
    33         if(ans[i]<0) { ans[i]+=10; ans[i+1]-=1; }
    34     }
    35     int len=length;
    36     for(int i=length;i>=1;i--) {
    37         if( ans[i]==0 ) len--;
    38         else break;
    39     }
    40     if(bigb) cout<<"-";
    41     for(int i=len;i>=1;i--) cout<<ans[i];
    42 
    43     return 0;
    44 }

    高精度加法:https://www.luogu.org/problemnew/show/P1601

     1 #include<iostream>
     2 using namespace std;
     3 
     4 string a1,b1;
     5 int a[505],b[505];//由低位到高位 
     6 int ans[505];
     7 
     8 int main(){
     9     cin>>a1>>b1;
    10     for(int i=0;i<a1.length();i++) a[a1.length()-i] =int(a1[i])-48;    
    11     
    12     for(int i=0;i<b1.length();i++) b[b1.length()-i] = int(b1[i])-48;
    13     
    14     int length=max(a1.length(),b1.length());//要考虑这么多上下相加 
    15     for(int i=1;i<=length;i++){
    16         ans[i] += a[i]+b[i];
    17         if(ans[i]>9) { ans[i]-=10; ans[i+1]=1; }
    18     }
    19     if(ans[length+1]!=0) length+=1;
    20     for(int i=length;i>=1;i--) cout<<ans[i];
    21     
    22     return 0;
    23 }
  • 相关阅读:
    bzoj1103[POI2007]大都市meg
    bzoj1098[POI2007]办公楼biu
    bzoj1102[POI2007]山峰和山谷Grz
    POI刷题记录
    语法-指针
    dp-最长公共子序列
    如何判断素数
    C++的map用法
    stl-优先队列
    C++和Java的stack语法
  • 原文地址:https://www.cnblogs.com/ZhenghangHu/p/9339111.html
Copyright © 2020-2023  润新知