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

来源:互联网 发布:微信js sdk 分享 编辑:程序博客网 时间:2024/06/06 14:22
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;

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

就这样;

原创粉丝点击