前面的题目加了个高精度。。。写个类完事
然而本地AC OJ WA,把重载的==改成普通函数也不行。。那我只能装作自已AC了。思路是没问题的
重新写一遍发现第一次不能判断 0 -1 1的情况,第二次写发现特别大的数据出问题了。。。。吐血,日后再重新写类吧
代码一
#include<iostream>
#include<cstring>
using namespace std;
const int N = 2e4;
typedef long long ll;
string alpha = "0123456789ABCDEF";
pair<int,int> complex[16] =
{
{0,0},{1,0},{-1,1},{0,1},
{0,-2},{1,-2},{-1,-1},{0,-1},
{2,2},{3,2},{1,3},{2,3},
{2,0},{3,0},{1,1},{2,1}
};
#include<iostream>
#include<cctype>
#include<cstring>
using namespace std;
const int MAXN = 1000;
class big
{
public:
int dig[MAXN];
int sign;
int LEN;
//public:
big();
big(string s);
big(const char *c);
big(long long a);
big &operator=(const big& b);
big operator+(big b);
big operator*(big b);
big operator+=(big b);
bool operator==(int a);
void out();
void carry();
void test();
bool com(ll a);
};//
void big::test()
{
cout << sign << " " << LEN << endl;
out();cout << endl;
}
void big::out()
{
int l = MAXN - 1;
while(dig[l] == 0 && l > 0)//注意0的情况
l--;
cout << ((sign == 1) ? "" : "-");
for(;l >= 0; l--)
cout << dig[l];
//cout <<endl;
}
void big::carry()
{
bool flag = 0;
for(int i = 0; i < this->LEN; i++)
{
if(this->dig[i] >= 10)
{
this->dig[i + 1] += this->dig[i] / 10;
this->dig[i] %= 10;
if(i == LEN - 1)
LEN++;
}
else if(this->dig[i] < 0)
{
while(this->dig[i] < 0)
{
this->dig[i + 1]--;
this->dig[i] += 10;
}
flag = 1;
}
}
if(flag)
{
while(dig[LEN - 1] == 0 && LEN - 1 >= 0)
LEN--;
if(LEN == 0)
LEN = 1;
}
}//
big::big()
{
LEN = 1;
sign = 1;
memset(dig,0,sizeof(dig));
}
big::big(string s)
{
memset(dig,0,sizeof(dig));
LEN = 0;
int len = s.length();
for(int i = len - 1; i >= 0; i--)
{
switch(s[i])
{
case '+':
sign = 1;break;
case '-':
sign = -1;break;
default:
dig[LEN++] = s[i] - '0';
break;
}
}
if(sign != -1)sign = 1;
}
big::big(long long a)
{
memset(dig,0,sizeof(dig));
LEN = 0;
sign = ((a >= 0) ? 1 : -1);
if(a < 0)
a = -a;
while(a)
{
dig[LEN++] = a % 10;
a /= 10;
}
if(sign != -1)sign = 1;
}
big::big(const char *c)
{
memset(dig,0,sizeof(dig));
LEN = 0;
int len = strlen(c);
for(int i = len - 1; i >= 0; i--)
{
switch(c[i])
{
case '+':
sign = 1;break;
case '-':
sign = -1;break;
default:
dig[LEN++] = c[i] - '0';
}
}
if(sign != -1)sign = 1;
}
big& big::operator=(const big & b)
{
this->sign = b.sign;
this->LEN = b.LEN;
for(int i = 0; i < LEN;i++)
{
this->dig[i] = b.dig[i];
}
return *this;
}
big big::operator+(big b)
{
if(this->sign * b.sign == -1)
{
if(b.LEN > this->LEN)
{
for(int i = 0; i < b.LEN; i++)
b.dig[i] -= this->dig[i];
b.carry();
return b;
}
else if(b.LEN < this->LEN)
{
for(int i = 0; i < this->LEN; i++)
this->dig[i] -= b.dig[i];
this->carry();
return *this;
}
else
{
bool flag = true;
for(int i = b.LEN - 1; i >= 0; i--)
{
if(this->dig[i] > b.dig[i])
{flag = true;break;}
else if(this->dig[i] < b.dig[i])
{flag = false;break;}
}
if(flag)
{
for(int i = 0; i < this->LEN; i++)
this->dig[i] -= b.dig[i];
this->carry();
return *this;
}
else
{
for(int i = 0; i < b.LEN; i++)
b.dig[i] -= this->dig[i];
b.carry();
return b;
}
}
}
else
{
int mlen = ((this->LEN > b.LEN) ? this->LEN : b.LEN);
for(int i = 0; i < mlen; i++)
this->dig[i] += b.dig[i];
this->carry();
}
return *this;
}
big big::operator*(big b)
{
big B;
B.sign = this->sign * b.sign;
for(int i = 0; i < b.LEN; i++)
{
for(int j = 0; j < this->LEN; j++)
{
B.dig[i + j] += this->dig[j] * b.dig[i];
B.LEN = i + j + 1;//注意长度
B.carry();
}
}
return B;
}
bool big::operator==(int a)
{
if(a * sign < 0)
return false;
if(a < 0)
a = -a;
int alen = 0;
int dlen = MAXN;
while(dig[dlen - 1] == 0 && dlen - 1 >= 0)
dlen--;
if(dlen == 0)
dlen++;
int temp = a;
if(temp == 0)
alen = 1;
while(temp)
{
alen++;
temp/=10;
}
if(dlen != alen)
return false;
temp = 0;
for(int i = 0; i < alen; i++)
{
if(a % 10 != dig[i])
return false;
a/=10;
temp++;
}
return true;
}
void out(big R, big I)
{
if(R==0)
{
if(I==0)
cout << "0";
else if(I==1)
cout << "i";
else if(I==-1)
cout << "-i";
else
{
I.out();
cout << 'i';
}
}
else
{
R.out();
if(I==0){}
else if(I==1)
cout << "+i";
else if(I==-1)
cout << "-i";
else
{
cout << ((I.sign == 1) ? "+" : "");
I.out();
cout << 'i';
}
}
}
int main()
{
string s;
cin >> s;
int len = s.length();
big R(complex[alpha.find(s[2])].first);
big I(complex[alpha.find(s[2])].second);
for(int i = 3; i < len; i++)
{
R = R * -4;
I = I * -4;
R = R + complex[alpha.find(s[i])].first;
I = I +complex[alpha.find(s[i])].second;
}
out(R,I);
}
类二
#include<iostream>
#include<cctype>
#include<cstring>
typedef long long ll;
const int N = 300;
using namespace std;
struct bigint
{
ll arr[N];
int sign;
bigint(ll a)
{
memset(arr,0,sizeof(arr));
if(a == 0)
sign = 0;
else if(a < 0)
{
sign = -1;
a = -a;
}
else
sign = 1;
int len = 0;
while(a)
{
arr[len++] = a % 10;
a /= 10;
}
}
bigint(string s)
{
memset(arr,0,sizeof(arr));
int len = 0;
int l = s.length();
if(s[0] == '-')
sign = -1;
else if(s[0] == '0')
sign = 0;
else
sign = 1;
for(int i = l - 1; i >= 0; i--)
{
if(s[i] == '-')
sign = -1;
else
{
arr[len++] = s[i] - '0';
}
}
}
bigint(const bigint & b)
{
memset(arr,0,sizeof(arr));
sign = b.sign;
for(int i = 0; i < N ;i ++)
arr[i] = b.arr[i];
}
bool big(const bigint & b)const
{
if(sign > b.sign)
return true;
else if(sign < b.sign)
return false;
else
{
if(sign == 1)
{
for(int i = N - 1; i >= 0; i--)
{
if(arr[i] > b.arr[i])
return true;
else if(arr[i] < b.arr[i])
return false;
}
return false;
}
else if (sign == -1)
{
for(int i = N - 1; i >= 0; i--)
{
if(arr[i] < b.arr[i])
return true;
else if(arr[i] > b.arr[i])
return false;
}
return false;
}
}
}
bool ABSbig(const bigint & b)const
{
for(int i = N - 1; i >= 0; i--)
{
if(arr[i] > b.arr[i])
return true;
else if(arr[i] < b.arr[i])
return false;
}
return false;
}
bool small(const bigint & b)const
{
if(sign > b.sign)
return false;
else if(sign < b.sign)
return true;
else
{
if(sign == 1)
{
for(int i = N - 1; i >= 0; i--)
{
if(arr[i] > b.arr[i])
return false;
else if(arr[i] < b.arr[i])
return true;
}
return false;
}
else if (sign == -1)
{
for(int i = N - 1; i >= 0; i--)
{
if(arr[i] < b.arr[i])
return false;
else if(arr[i] > b.arr[i])
return true;
}
return false;
}
}
}
bool ABSsmall(const bigint & b)const
{
for(int i = N - 1; i >= 0; i--)
{
if(arr[i] > b.arr[i])
return false;
else if(arr[i] < b.arr[i])
return true;
}
return false;
}
bigint operator+(const bigint & b)
{
bigint t(*this);
if(sign * b.sign > 0)
{
for(int i = 0; i < N; i++)
t.arr[i] += b.arr[i];
}
else if(sign == 0)
return b;
else if(b.sign == 0)
return t;
else if(ABSbig(b))
{
t.sign = sign;
for(int i = 0; i < N; i++)
t.arr[i] = arr[i]-b.arr[i];
}
else if(ABSsmall(b))
{
t.sign = -sign;
for(int i = 0; i < N; i++)
t.arr[i] = b.arr[i] - arr[i];
}
else
{
memset(t.arr,0,sizeof(t.arr));
}
t.carry();
return t;
}
bigint operator*(const bigint & b)
{
bigint t(*this);
memset(t.arr,0,sizeof(t.arr));
t.sign = sign * b.sign;
for(int i = 0; i < N - 1; i++)
{
for(int j = 0; j + i < N - 1; j++)
{
t.arr[i+j] += arr[i] * b.arr[j];
}
t.carry();
}
t.carry();
return t;
}
bigint& operator=(const bigint &b)
{
for(int i = 0; i < N; i++)
arr[i] = b.arr[i];
sign = b.sign;
return *this;
}
void carry()
{
for(int i = 0; i < N; i++)
{
if(arr[i] < 0)
{
while(arr[i] < 0)
{
arr[i + 1] -= 1;
arr[i] += 10;
}
}
else if(arr[i] >= 10)
{
arr[i + 1] += arr[i] / 10;
arr[i] %= 10;
}
}
}
void print()
{
cout << ((sign == -1)?"-":"");
int l = N -1;
while(arr[l] == 0 && l > 0)
l--;
while(l >= 0)
cout << arr[l--];
}
};
string alpha = "0123456789ABCDEF";
pair<int,int> complex[16] =
{
{0,0},{1,0},{-1,1},{0,1},
{0,-2},{1,-2},{-1,-1},{0,-1},
{2,2},{3,2},{1,3},{2,3},
{2,0},{3,0},{1,1},{2,1}
};
int main()
{
bigint b(10);
string s;
cin >> s;
int len = s.length();
bigint R(complex[alpha.find(s[2])].first);
bigint I(complex[alpha.find(s[2])].second);
for(int i = 3; i < len; i++)
{
bigint base(-4);
R = base * R;
I = base * I;
bigint _1(complex[alpha.find(s[i])].first);
R = R + _1;
bigint _2(complex[alpha.find(s[i])].second);
I = I + _2;
}
if(!R.small(0) && !R.big(0))//实数是零
{
if(!I.small(0) && !I.big(0))
cout << '0' ;
else if(!I.small(1) && !I.big(1))
cout << "i";
else if(!I.small(-1) && !I.big(-1))
cout << "-i";
else
{
I.print();cout << 'i';
}
}
else
{
R.print();
if(!I.small(0) && !I.big(0)){}
else if(!I.small(1) && !I.big(1))
cout << "+i";
else if(!I.small(-1) && !I.big(-1))
cout << "-i";
else
{
cout << ((I.sign == 1) ? "+" : "");
I.print();cout << 'i';
}
}
}