#include<bits/stdc++.h>
using namespace std;

void add(string sa,string sb){
    int a[1005]={0},b[1005]={0},c[1005]={0};
    int alen=sa.size(),blen=sb.size();
    for(int i=0;i<alen;i++)a[alen-1-i]=sa[i]-'0';
    for(int i=0;i<blen;i++)b[blen-1-i]=sb[i]-'0';
    int clen=max(alen,blen);
    for(int i=0;i<clen;i++){
        c[i]+=a[i]+b[i];
        if(c[i]>9){
            c[i+1]+=c[i]/10;
            c[i]%=10;
        }
    }
    if(c[clen])clen++;
    cout<<"加法结果: ";
    for(int i=clen-1;i>=0;i--)cout<<c[i];
    cout<<endl;
}

void subtract(string aa,string bb){
    int a[1005]={0},b[1005]={0},c[1005]={0};
    bool flag=0;
    int la=aa.size(),lb=bb.size();
    if(la<lb||(la==lb&&aa<bb)){
        flag=1;
        swap(aa,bb);
        swap(la,lb);
    }
    for(int i=0;i<lb;i++)b[i]=bb[lb-i-1]-'0';
    for(int i=0;i<la;i++)a[i]=aa[la-i-1]-'0';
    for(int i=0;i<la;i++){
        c[i]+=a[i]-b[i];
        if(c[i]<0){
            c[i+1]--;
            c[i]+=10;
        }
    }
    int lc=la;
    while(lc>0&&c[lc-1]==0)lc--;
    cout<<"减法结果: ";
    if(flag&&lc!=0)cout<<"-";
    if(lc==0)cout<<"0";
    else for(int i=lc-1;i>=0;i--)cout<<c[i];
    cout<<endl;
}

void multiply(string aa,string bb){
    int a[1005]={0},b[1005]={0},c[2005]={0};
    int flaga=1,flagb=1,begina=0,beginb=0;
    int la=aa.size(),lb=bb.size(),lc=la+lb;
    if(aa[0]=='-'){flaga=-1;begina=1;la--;}
    if(bb[0]=='-'){flagb=-1;beginb=1;lb--;}
    for(int i=0;i<la;i++)a[i]=aa[la-i-1+begina]-'0';
    for(int i=0;i<lb;i++)b[i]=bb[lb-i-1+beginb]-'0';
    for(int i=0;i<la;i++){
        for(int j=0;j<lb;j++){
            c[i+j]+=a[i]*b[j];
        }
    }
    for(int i=0;i<lc;i++){
        c[i+1]+=c[i]/10;
        c[i]%=10;
    }
    while(lc>0&&c[lc-1]==0)lc--;
    cout<<"乘法结果: ";
    if(flaga*flagb<0&&lc>0)cout<<"-";
    if(lc==0)cout<<"0";
    else for(int i=lc-1;i>=0;i--)cout<<c[i];
    cout<<endl;
}

void divide(string aa,long long b){
    long long a[10005]={0},c[10005]={0},r=0;
    int lena=aa.size();
    for(int i=0;i<lena;i++)a[i]=aa[i]-'0';
    for(int i=0;i<lena;i++){
        r=r*10+a[i];
        c[i]=r/b;
        r=r%b;
    }
    int cs=0;
    while(cs<lena-1&&c[cs]==0)cs++;
    cout<<"除法结果(商): ";
    if(cs==lena)cout<<"0";
    else for(int i=cs;i<lena;i++)cout<<c[i];
    cout<<"\n余数: "<<r<<endl;
}

int compare(string a,string b){
    if(a.size()>b.size())return 1;
    if(a.size()<b.size())return 2;
    for(int i=0;i<a.size();i++){
        if(a[i]>b[i])return 1;
        if(a[i]<b[i])return 2;
    }
    return 0;
}

int main(){
    cout<<"高精度计算器"<<endl;
    cout<<"1.加法 2.减法 3.乘法 4.除法 5.比较 0.退出"<<endl;
    int choice;
    while(true){
        cout<<"\n请选择操作(0-5): ";
        cin>>choice;
        if(choice==0)break;
        string num1,num2;
        long long divisor;
        switch(choice){
            case 1:
                cout<<"输入两个加数: ";
                cin>>num1>>num2;
                add(num1,num2);
                break;
            case 2:
                cout<<"输入被减数和减数: ";
                cin>>num1>>num2;
                subtract(num1,num2);
                break;
            case 3:
                cout<<"输入两个乘数: ";
                cin>>num1>>num2;
                multiply(num1,num2);
                break;
            case 4:
                cout<<"输入被除数和除数: ";
                cin>>num1>>divisor;
                divide(num1,divisor);
                break;
            case 5:
                cout<<"输入两个比较的数: ";
                cin>>num1>>num2;
                int res=compare(num1,num2);
                cout<<"比较结果: ";
                if(res==0)cout<<"相等";
                else if(res==1)cout<<num1<<" > "<<num2;
                else cout<<num1<<" < "<<num2;
                cout<<endl;
                break;
            default:
                cout<<"无效选择!"<<endl;
        }
    }
    cout<<"感谢使用高精度计算器!"<<endl;
    return 0;
}