大佬们救命,本机上能跑,但这里wa,有一点头绪但不知道怎么解决
查看原帖
大佬们救命,本机上能跑,但这里wa,有一点头绪但不知道怎么解决
429367
pyyyyyyyyyyy楼主2020/11/28 17:07

蒟蒻想做一个支持cin的bigint,试图用cin.peek()做到和cin读入int相同的效果(读到非字符自动停止) 然而在最后有一个eof而没有换行的时候出了问题,发现在还有一个字符未读入的时候cin.peek()就开始等待下一个字符了 于是造成了4wa1ac的情况(猜测那个ac是因为给了换行?) 以下是代码

#include<bits/stdc++.h>
#define df(i,n) for(int i=0;i<n;i++)
#define f(i,n) for(i=0;i<n;i++)
#define p puts("")
using namespace std;

class bigint
{
  private:
    int k=1;
    bool zero=0;
    int z[10001]={};
    int len=0;
    int wei=10000;
  public:
    friend istream& operator >>(istream&,bigint&);
    friend ostream& operator <<(ostream&,bigint);
    friend bigint operator +(bigint,bigint);
    friend bigint operator -(bigint,bigint);
};

bigint operator +(bigint a,bigint b);
bigint operator -(bigint a,bigint b);
istream& operator >>(istream& in,bigint& a);
ostream& operator <<(ostream& out,bigint a);

istream& operator >>(istream& in,bigint& a)
{
  char *z=new char[a.wei*8+8];
  char c;
  char *pc=z;
  c=cin.peek();
  while(c=='\t'||c=='\n'||c==' ')
  {
    cin.get(c);
    c=cin.peek();
  }
  if(c=='+')
  {
    cin>>c;
    a.k=1;
  }
  if(c=='-')
  {
    cin>>c;
    a.k=-1;
  }
  memset(a.z,0,sizeof(a.z));
  char d;
  for(d=cin.peek();d>='0'&&d<='9';pc++,d=cin.peek())
  {
    scanf("%c",pc);
  }
  a.len=strlen(z);
  int n=1,b=a.wei;
  a.zero=1;
  for(int i=a.len-1;i>=0;i--)
  {
    if(n==100000000)n=1,b--;
    a.z[b]+=n*(z[i]-'0');
    n*=10;
    if(z[i]!=0)a.zero=0;
  }
  //delete[] z;
  return in;
}
ostream& operator <<(ostream& out,bigint a)
{
  int i=0;
  if(a.zero==1)cout<<'0';
  else
  {
    if(a.k==-1)cout<<'-';
    while(a.z[i]==0)i++;
    printf("%d",a.z[i++]);
    for(;i<=a.wei;i++)
    {
      printf("%08d",a.z[i]);
    }
  }
  return out;
}
bigint operator +(bigint a,bigint b)
{
  bigint c,d;
  c.k=0;
  for(int i=0;i<=a.wei;i++)
  {
    d.z[i]+=a.k*a.z[i]+b.k*b.z[i];
    if(d.z[i]>0)
    {
      c.k=1;
      break;
    }
    if(d.z[i]<0)
    {
      c.k=-1;
      break;
    }
  }
  if(c.k==0)
  {
    c.k=1;
    c.zero=1;
    return c;
  }
  if(c.k==1)
    for(int i=a.wei;i>=1;i--)
    {
      c.z[i]+=a.k*a.z[i]+b.k*b.z[i];
      if(c.z[i]>=100000000)
      {
        c.z[i-1]++;
        c.z[i]-=100000000;
      }
      if(c.z[i]<0)
      {
        c.z[i-1]--;
        c.z[i]+=100000000;
      }
    }
  else 
    for(int i=a.wei;i>=1;i--)
    {
      c.z[i]+=-1*(a.k*a.z[i]+b.k*b.z[i]);
      if(c.z[i]>=100000000)
      {
        c.z[i-1]++;
        c.z[i]-=100000000;
      }
      if(c.z[i]<0)
      {
        c.z[i-1]--;
        c.z[i]+=100000000;
      }
    }
  return c;
}
bigint operator -(bigint a,bigint b)
{
  b.k*=-1;
  return a+b;
}
int main()
{
  bigint a,b;
  cin>>a>>b;
  cout<<a+b;
  return 0;
}

2020/11/28 17:07
加载中...