补充上一篇博客 十六进制转二进制转八进制 面对非常大的数字的时候

思路:

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

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

posted @ 2018-03-23 20:49  须小弥  阅读(220)  评论(0编辑  收藏  举报