蒟蒻想做一个支持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;
}