高精度减法(调试得人心烦意乱)

本文介绍了一种使用C++实现的大整数减法算法,包括字符串反转、字符数组转换为整数数组的过程,并详细展示了如何进行大整数的比较与减法运算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

include<bits/stdc++.h>
using namespace std;
const int M=5000,N=20000,p=100000;//p是位数吧大概;好像并没有用到www; 
char s[2][N];
int cheng[5]={1,10,100,1000,10000};//只能5; 
int n[2][M],l[2],sum[M],iter,tmp,itera,flag,l_n[2];
bool compare(char*,char*);
int main(){
    memset(sum,0,sizeof(sum));
    cin>>s[0]>>s[1];
//  cout<<compare(s[0],s[1])<<endl;
    if(!compare(s[0],s[1])) flag=1;
//  cout<<sum[M]<<endl;
    for(int i=0;i<=1;i++){
    //  cin>>s[i];//把input放在前面,便于先判断大小再直接转int; 
        tmp=itera=iter=0;
        l[i]=strlen(s[i]);

        for(int j=0;j<l[i]/2;j++)   //啊这一个,不能取等; 
        swap(s[i][j],s[i][l[i]-j-1]);
        for(int j=0;j<l[i];j++){    //这不能取等(取等的现象:第一个n为负); 
            if(iter>=5){    //  压位的数字(出错的现象:莫名其妙少数字或添了0); 
                n[flag][itera++]=tmp;
                tmp=0;
                iter=0;
            }
            tmp+=(s[i][j]-48)*cheng[iter];//注意-48; 
            iter++;
        }
//      cout<<endl<<iter<<' '<<tmp<<endl;
        if(tmp) {n[flag][itera]=tmp;l_n[flag]=itera;}
        else l_n[flag]=--itera;
        flag=(1-flag);  //啊本来是用i来标n的但是呢嘿嘿嘿; 
    }
//  for(int i=0;i<l[0];i++) cout<<s[0][i];  // reverse success;

/*  for(int i=0;i<=1;i++){
        int flag=0;
        for(int j=l[i];j>=0;j--){   //不知道为什么从l[i]开始迭代; 
            if(flag)
                printf("%05d",n[i][j]);
            else{
                printf("%d",n[i][j]);
                flag=1;
            }
        }
        cout<<endl; 
    }*/     //转int success;
//  for(int i=M-1;i>=0;i--) cout<<sum[i]<<' ';

    //要开始做减法了注意了啊各位看好b( ̄▽ ̄)d;
    for(int i=0;i<=max(l_n[1],l_n[0]);i++){
        sum[i]+=n[0][i]-n[1][i];
        if(sum[i]<0)    {sum[i+1]--;sum[i]+=p;}//退位; 
    }
//  cout<<l_n[1];   //length correct;

//  cout<<n[0][0]<<' '<<n[1][0];

    int check=0;
    for(int i=0;i<M;i++)
    if(n[0][i]!=n[1][i])    {check=1;break;}
    //以下是两个数字一样时的输出;
    if(!check)  {cout<<'0';return 0;}
    //以下是两个数字不一样时的输出; 
    int begin=0,jb=0;
    if(flag==1) cout<<'-';
    for(int i=M-1;i>=0;i--){
        if(begin==0 && sum[i])  {begin=1;}
        if(begin==1 && jb==1)   printf("%05d",sum[i]);
        if(begin==1 && jb==0)   {printf("%d",sum[i]);jb=1;}

    }/**/
    return 0;
}
bool compare(char *a,char *b){
//  cout<<endl;
//  cout<<"a=="<<a[0]<<endl<<"b=="<<b[0]<<endl;
    if(strlen(a)>strlen(b)) return 1;
    else if(strlen(a)<strlen(b))    return 0;

    for(int i=strlen(a)-1;i>=0;i--)
    if(a[i]!=b[i]){
        if(a[i]>b[i])   return 1;
        else return 0;
    }
    return 0;
}
//注释掉的都是检验用代码呢;
//苟屁!全tm是你的废话; 

注意事项有:

1:const int 的p;
2:reverse时不能取到,会重复;
3:这个减法必须先判断谁大谁小,一点人生的经验;
4:本来用strcmp就行但是因为我的愚蠢(数组下标又搞错了(人体学自动加一屌不屌?))自己写了个compare;

千疮百孔啊;
洛谷的数据算是过了;

就这样;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值