• 进制转换


    高精度进制转换,挺无聊的这种题,非要写个麻烦的高精度。

    const int N=110;
    struct bignum
    {
        int m[N];
        int len;
        bignum()
        {
            memset(m,0,sizeof m);
            len=0;
        }
    };
    int ra,rb;
    string a;
    int r;
    
    int get(char x)
    {
        if(isdigit(x)) return x-'0';
        return x-'A'+10;
    }
    
    char trans(int x)
    {
        if(x<10) return '0'+x;
        return 'a'+x-10;
    }
    
    bignum mul(bignum a,int b)
    {
        bignum c;
        c.len=a.len;
        int carry=0;
        for(int i=0;i<c.len;i++)
        {
            int t=a.m[i]*b+carry;
            c.m[i]=t%10;
            carry=t/10;
        }
        while(carry)
        {
            c.m[c.len++]=carry%10;
            carry/=10;
        }
    
        while(c.len > 1 && c.m[c.len-1] == 0) c.len--;
        return c;
    }
    
    bignum add(bignum a,bignum b)
    {
        bignum c;
        c.len=max(a.len,b.len);
    
        int carry=0;
        for(int i=0;i<c.len;i++)
        {
            int t=a.m[i]+b.m[i]+carry;
            c.m[i]=t%10;
            carry=t/10;
        }
        if(carry) c.m[c.len++]=carry;
        return c;
    }
    
    bignum Div(bignum a,int b)
    {
        bignum c;
        c.len=a.len;
    
        r=0;
        for(int i=c.len-1;i>=0;i--)
        {
            r=r*10+a.m[i];
            c.m[i]=r/b;
            r%=b;
        }
        while(c.len > 1 && c.m[c.len-1] == 0) c.len--;
        return c;
    }
    
    int main()
    {
        while(cin>>ra>>rb)
        {
            string sa;
            cin>>sa;
    
            bignum a;
            a.m[0]=0,a.len=1;
            bignum base;
            base.m[0]=1,base.len=1;
    
            for(int i=sa.size()-1;i>=0;i--)
            {
                int t=get(sa[i]);
                //a=base*t+a;
                //base=base*ra
                a=add(mul(base,t),a);
                base=mul(base,ra);
            }
    
            string res;
            while(a.m[0] != 0 || a.len > 1)
            {
                //a=a/rb;
                a=Div(a,rb);
                res+=trans(r);
            }
            reverse(res.begin(),res.end());
            cout<<res<<endl;
        }
        //system("pause");
        return 0;
    }
    
  • 相关阅读:
    minixml3.1库的使用
    linux coredump及函数栈空间大小分析
    linx 设备名字来由 sd sr sg st
    gcc 遇到过的语法问题
    I帧、B帧、P帧、NALU类型
    linux grub 使用
    结构体sockadrr、sockaddr_in、in_addr的定义
    linux c log 日志接口
    关于32位/64位版本头文件的重要
    汇编指令缩写
  • 原文地址:https://www.cnblogs.com/fxh0707/p/14404046.html
Copyright © 2020-2023  润新知