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;
        }
    }
    
    

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

  • 相关阅读:
    第八周学习总结
    《程序是怎样跑起来的》第十一章
    第七周学习总结
    《程序是怎样跑起来的》第十章
    《程序是怎样跑起的》第九章
    第五周学习总结
    《程序是怎样跑起来的》第八章
    《程序是怎样跑起来的》第七章
    抽象类与接口学习总结
    多态学习总结
  • 原文地址:https://www.cnblogs.com/simuhunluo/p/8634410.html
Copyright © 2011-2022 走看看