课后自主练习(高精度)1080. i-1 进制 naive《编程思维与实践》个人学习笔记

前面的题目加了个高精度。。。写个类完事

然而本地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';
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值