高精度

//1.读入字符串 

//scanf
//可以同一行,中间用空格隔开,也可以两行
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
char s1[1010],s2[1010];
int main(){
    scanf(%s%s,s1,s2);
    int lena=strlen(s1);
    int lenb=strlen(s2);
    ...
} 
//gets
//只能两行
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
char s1[1010],s2[1010];
int main(){
    gets(s1);gets(s2);
    int lena=strlen(s1);
    int lenb=strlen(s2);
    ...
} 
//cin
//可以同一行,中间用空格隔开,也可两行
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int main(){
    string s1,s2;
    cin>>s1>>s2;
    int lena=strlen(s1);
    int lenb=strlen(s2);
    ...
} 

//2.存入数组
//注意倒叙    1~len -> 低位~高位 
for(int i=1;i<=lena;i++){
    a[i]=s[lena-i]-'0';//字符串最后一位是'0'
}

//3.加法
//(1)模拟手工计算,设置一个进位标记m 
int m=0;
lenc=max(lena,lenb);
for(int i=1;i<=lenc;i++){
    c[i]=(m+a[i]+b[i])%10;
    m=(m+a[i]+b[i])/10;
}
if(m==1){
    lenc++;
    c[lenc]=1;
}
//(2)先计算后处理进位
for(int i=1;i<=lenc;i++)
    c[i]=a[i]+b[i];
for(int i=1;i<=lenc;i++){
    c[i+1]=c[i+1]+c[i]/10;
    c[i]=c[i]%10l
}
if(c[lenc+1]==1) lenc++;
//(2)++  去掉c数组
lena>lenb
for(int i=1;i<=lena;i++) a[i]=a[i]+b[i];
for(int i=1;i<=lena;i++){
    a[i+1]=a[i+1]+a[i]/10;
    a[i]=a[i]%10;
} 
if(a[lena+1]==1) lena++;

//4减法
//(1)借位 
for(int i=1;i<=lena;i++){
    if(a[i]<b[i]){
        a[i+1]--;
        a[i]+=10;
    }
    a[i]-=b[i];
} 
//(2)输出
while(a[lena]==0&&lena>1) lena--;
for(int i=lena;i>=1;i--)
    cout<<a[i];
cout<<endl; 
//(3)谁减谁的问题
if(strcmp(s1,s2)==0) {cout<<0<<endl;return 0;}
if(lena<lenb||lena==lenb&&strcmp(s1,s2)<0){
    strcpy(s3,s1);
    strcpy(s1,s2);
    strcpy(s2,s3);
    swap(lena,lenb);
    cout<<'-';
} 
//5乘法
for(int i=1;i<=lena;i++)
    for(int j=1;j<=lenb;j++)
        c[i*j-1]=a[i]*b[j];
int lenc=lena+lenb-1;
for(int i=1;i<=lenc;i++){
    c[i+1]=c[i+1]+c[i]/10;
    c[i]%=10;
}
if(c[lenc+1]>0) lenc++;
//6位运算结果的输出
for(int i=lenc;i>=1;i--)
    cout<<c[i]<<" "; 
cout<<endl;
原文地址:https://www.cnblogs.com/lcan/p/9482275.html