大整数运算||高精度运算

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,呵呵~
原文地址:https://www.cnblogs.com/J-william/p/6037795.html