zoukankan      html  css  js  c++  java
  • 大整数运算||高精度运算

    codevs 3116 高精加法:

    #include<cstdio>
    #include<iostream>
    #include<cstring>
    using namespace std;
    int a[300],b[300],c[300],j=1;
    char x[300],y[300];
    int main(){
        cin>>x>>y;
        a[0]=strlen(x);
        b[0]=strlen(y);
        for(int i=1;i<=a[0];i++)
        a[i]=x[a[0]-i]-'0';
        for(int i=1;i<=b[0];i++)
        b[i]=y[b[0]-i]-'0';
    //      以上為輸入數據。
        do{
            c[j]=a[j]+b[j]+c[j];
            if(c[j]>=10) {c[j]=c[j]%10;c[j+1]++;}
            j++;
            a[0]--;
            b[0]--;
        }while(a[0]>0||b[0]>0);
    //      以上為高精加法。
        while(!c[j]) j--;
        while(j) {cout<<c[j];j--;}
    //      以上為輸出。
        return 0;
    }
    View Code 

    codevs 3115 高精減法:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    using namespace std;
    char s1[666],s2[666];
    int a[666],b[666],c[666],al,bl,cl,pan=0;
    int main(){
        cin>>s1>>s2;
        al=strlen(s1);
        bl=strlen(s2);
        if(al>bl||(al==bl&&s1[0]>=s2[0])){
            for(int i=1;i<=al;i++)
            a[i]=s1[al-i]-'0';
            for(int i=1;i<=bl;i++)
            b[i]=s2[bl-i]-'0';
        }
        else{
            for(int i=1;i<=bl;i++)
            a[i]=s2[bl-i]-'0';
            for(int i=1;i<=al;i++)
            b[i]=s1[al-i]-'0';
            cl=al,al=bl,bl=cl;
            cout<<"-";
        }
    //      以上為輸入數據。
        for(int i=1;i<=al;i++){
            if(a[i]<b[i]) {a[i+1]--;a[i]+=10;}
            c[i]=a[i]-b[i];
        }
    //      以上為高精減法。
        while(al&&!c[al]) al--;
        while(al) {cout<<c[al];al--;pan=1;}
        if(!pan) cout<<"0";
    //      以上為輸出。
        cout<<endl;
        return 0;
    }
    View Code

    codevs 3117 高精乘法:

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<cmath>
     5 using namespace std;
     6 char s1[666],s2[666];
     7 int a[666],b[666],c[666],al,bl,cl;
     8 int main(){
     9     cin>>s1>>s2;
    10     al=strlen(s1);
    11     bl=strlen(s2);
    12     for(int i=1;i<=al;i++)
    13     a[i]=s1[al-i]-'0';
    14     for(int i=1;i<=bl;i++)
    15     b[i]=s2[bl-i]-'0';
    16 //      以上為輸入數據。
    17     for(int i=1;i<=al;i++){
    18         for(int j=1;j<=bl;j++){
    19             c[i+j-1]+=a[i]*b[j];
    20             c[i+j]+=c[i+j-1]/10;
    21             c[i+j-1]%=10;
    22         }
    23     }
    24 //      以上為高精乘法。
    25     cl=al+bl;
    26     while(cl>1&&!c[cl]) cl--;
    27     while(cl) {cout<<c[cl];cl--;}
    28 //      以上為輸出。
    29     cout<<endl;
    30     return 0;
    31 }
    View Code

    codevs 3118 高精除法:

    高精除低精(不常用):

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<iostream>
     4 using namespace std;
     5 long long b,s[2][3000],al,l;
     6 char a[3000];
     7 void gjcu(){
     8     for(int i=al+100;i>0;i--){
     9         s[0][i]=s[1][i]/b;
    10         if(s[1][i]%b) s[1][i-1]+=s[1][i]%b*10;
    11     }
    12 }
    13 int main(){
    14     cin>>a>>b;
    15     al=strlen(a);
    16     for(int i=1;i<=al;i++) s[1][100+i]=a[al-i]-'0';
    17     gjcu();
    18     l=al+100;
    19     while(!s[0][l]&&l>101) l--;
    20     for(int i=l;i>100;i--){
    21         if(i==100) printf(".");
    22         printf("%lld",s[0][i]);
    23     }
    24     printf("
    ");
    25     return 0;
    26 }
    View Code

    高精除高精(基本不用):

    思路就是把乘法變成減法。(我这个代码洛谷只给70分)

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<iostream>
     4 using namespace std;
     5 int s[4][3000],al,bl,p,d,ans;
     6 char a[3000],b[3000];
     7 int bj(int x,int y){
     8     int i=al;
     9     while(s[x][i]==s[y][i]&&i>0) i--;
    10     if(s[x][i]<s[y][i]) return -1;
    11     if(s[x][i]>s[y][i]) return 1;
    12     return 0;
    13 }
    14 void gjq(){
    15     for(int i=1;i<=bl+1;i++){
    16         s[3][i]-=s[2][i];
    17         if(s[3][i]<0){
    18             s[3][i]+=10;
    19             s[3][i+1]-=1;
    20         }
    21     }
    22 }
    23 void gjcgj(){
    24     for(int i=al;i>0;i--){
    25         d=0;
    26         for(int j=bl+1;j>1;j--) s[3][j]=s[3][j-1];
    27         s[3][1]=s[1][i];
    28         p=bj(3,2);
    29         if(p==1){
    30             do{
    31                 gjq();
    32                 ++d;
    33                 p=bj(3,2);
    34             }while(p==1);
    35         }
    36         s[0][i]=d;
    37     }
    38 }
    39 int main(){
    40     cin>>a>>b;
    41     al=strlen(a);bl=strlen(b);
    42     for(int i=1;i<=al;i++) s[1][i]=a[al-i]-'0';
    43     for(int i=1;i<=bl;i++) s[2][i]=b[bl-i]-'0';
    44     if(al<=bl){
    45         p=bj(1,2);
    46         if(p==-1||al<bl) {printf("0");return 0;}
    47         if(p==0) {printf("1");return 0;}
    48     }
    49     gjcgj();
    50     ans=al;
    51     while(!s[0][ans]) ans--;
    52     for(int i=ans;i>0;i--) printf("%d",s[0][i]);
    53     printf("
    "); 
    54     return 0;
    55 }
    View Code
    使用時建議大家放在函數里。什麼?你也有起名恐懼症,而且高精加和高精減都是gjj,呵呵~
  • 相关阅读:
    项目管理原则
    开发规范
    讲故事-如何才算确认了需求
    关于概要设计
    jQuery操作
    IE8,IE9,IE10绿色版,以及ColorPix
    机务UI设计小节
    Abstract Factory
    Flyweight
    Chain of Responsibility
  • 原文地址:https://www.cnblogs.com/J-william/p/6037795.html
Copyright © 2011-2022 走看看