P2412高精度减法

传送门

因为忘了带书回家,所以因为这道题我卡了半小时所以写篇博客“纪念”下

高精度减法中,如果被减数比减数小,就要用减数减去被减数。接下来的判断就是本题的核心。直接用strcmp是不行的,例如100与99,用strcmp就是99大,所以我们还要再看长度。这里要特别注意一点,下面的代码是不行的。

if(strcmp(s,k)>=0||lena>lenb)

所以判断这里我们就要分类讨论两次(第一次比较长度,第二次用strcmp)

代码如下(原谅蒟蒻的一匹的我代码长) 

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
char s[10001],k[10001];
int a[10000001],b[100001],c[10000001];
void j(int,int,int);
void jf(int lena,int lenb,int lenc)
{if(lena>lenb)
  {
    while(lenc<=lena||lenc<=lenb)
    { if(a[lenc]<b[lenc])
      {a[lenc+1]--;a[lenc]+=10;}
      c[lenc]=a[lenc]-b[lenc];
      lenc++;  
    }while(c[lenc]==0)lenc--;
   for(int i=lenc;i>=1;i--)
   cout<<c[i];
  }
  if(lena==lenb)
   {if(strcmp(s,k)>=0)
    {while(lenc<=lena||lenc<=lenb)
    { if(a[lenc]<b[lenc])
      {a[lenc+1]--;a[lenc]+=10;}
      c[lenc]=a[lenc]-b[lenc];
      lenc++;  
    }while(c[lenc]==0)lenc--;
   for(int i=lenc;i>=1;i--)
   cout<<c[i];
    }
    else j(lena,lenb,lenc);
   }
 if(lena<lenb)
 j( lena, lenb, lenc);
}
void j(int lena,int lenb,int lenc)
{while(lenc<=lena||lenc<=lenb)
   { if(b[lenc]<a[lenc])
   {b[lenc+1]--;b[lenc]+=10;}
      c[lenc]=b[lenc]-a[lenc];
      lenc++;  
   }while(c[lenc]==0)lenc--;
   cout<<"-";
   for(int i=lenc;i>=1;i--)
   cout<<c[i];
 
}
int main()
{int lena,lenb,lenc,t=0;
 scanf("%s",s);t++;
 scanf("%s",k);t++;
 lena=strlen(s);
 lenb=strlen(k);
 for(int i=0;i<=lena-1;i++)
 {a[lena-i]=s[i]-48;
 }
 for(int i=0;i<=lenb-1;i++)
 b[lenb-i]=k[i]-48;
 lenc=1;
if(strcmp(s,k)!=0)jf(lena,lenb,lenc);
else cout<<"0";
}

 

posted @ 2019-03-03 09:50  千载煜  阅读(194)  评论(0编辑  收藏  举报