zoukankan      html  css  js  c++  java
  • 补充上一篇博客 十六进制转二进制转八进制 面对非常大的数字的时候

    思路:

    1. int存不了很大的数字 同样 long long int也无能为力。所以用字符串存。
    2. 先把十六进制转为二进制。示例中我给出了一种 还算是比较高效的方式。使用位运算。
    3. 二进制转八进制 我的方法很简单。如果二进制串长度正好是3的倍数,那么就直接从头开始三个三个的算。如果模3得1,那就先把第一个数字转成八进制,剩下的部分长度就是3的倍数。如果模3得2,同理。pow函数不用也可以,直接用数字代替都行。

    代码:

    #include <iostream>
    #include <math.h>
    #include <sstream>//使用该库函数的ostringstream,将int变成string
    #include <string>
    using namespace std;
    
    //字符转数字
    int charToDigit(char c)
    {
    
        if(c=='A')
            return 10;
        else if(c=='B')
            return 11;
        else if(c=='C')
            return 12;
        else if(c=='D')
            return 13;
        else if(c=='E')
            return 14;
        else if(c=='F')
            return 15;
        else
            return c-'0';
    }
    string jinzhi16to2(string pre)
    {
        int length=pre.size();
        ostringstream oss;
        for(int i=0; i<length; i++)
        {
            int digit=charToDigit(pre[i]);
            for(int j=3;j>=0;j--){
                oss<<(digit>>j&1);//使用位运算的方式,得到二进制
            }
    
        }
        return oss.str();
    }
    string jinzhi2to8(string pre){
        int length=pre.length();//获取二进制串的长度
        int mod=length%3;
        ostringstream oss;
        if(mod==0){
            for(int i=0,tmp=0;i<length;i+=3){
                tmp=charToDigit(pre[i])*pow(2,2)+charToDigit(pre[i+1])*pow(2,1)+charToDigit(pre[i+2])*pow(2,0);
                oss<<tmp;
                tmp=0;
            }
        }else if(mod==1){
            oss<<charToDigit(pre[0])*pow(2,0);
            for(int i=1,tmp=0;i<length;i+=3){
                tmp=charToDigit(pre[i])*pow(2,2)+charToDigit(pre[i+1])*pow(2,1)+charToDigit(pre[i+2])*pow(2,0);
                oss<<tmp;
                tmp=0;
            }
        }else{
            oss<<charToDigit(pre[1])*pow(2,0)+charToDigit(pre[0])*pow(2,1);;
            for(int i=2,tmp=0;i<length;i+=3){
                tmp=charToDigit(pre[i])*pow(2,2)+charToDigit(pre[i+1])*pow(2,1)+charToDigit(pre[i+2])*pow(2,0);
                oss<<tmp;
                tmp=0;
            }
        }
        string s=oss.str();
        for(int i=0;i<s.length();i++){
            if(s[i]!='0'){
                s=s.substr(i);
                break;
            }
        }
        return s;
    }
    int main()
    {
        int n;
        cin>>n;
        string *A=new string[n];
        for(int i=0; i<n; i++)
        {
            cin>>A[i];
        }
        for(int i=0; i<n; i++)
        {
            cout<<jinzhi2to8(jinzhi16to2(A[i]))<<endl;
        }
    }
    
    

    截图(算的还是蛮快的):

  • 相关阅读:
    tyvj 1031 热浪 最短路
    【bzoj2005】 [Noi2010]能量采集 数学结论(gcd)
    hdu 1394 Minimum Inversion Number 逆序数/树状数组
    HDU 1698 just a hook 线段树,区间定值,求和
    ZeptoLab Code Rush 2015 C. Om Nom and Candies 暴力
    ZeptoLab Code Rush 2015 B. Om Nom and Dark Park DFS
    ZeptoLab Code Rush 2015 A. King of Thieves 暴力
    hdoj 5199 Gunner map
    hdoj 5198 Strange Class 水题
    vijos 1659 河蟹王国 线段树区间加、区间查询最大值
  • 原文地址:https://www.cnblogs.com/simuhunluo/p/8634410.html
Copyright © 2011-2022 走看看