补充上一篇博客 十六进制转二进制转八进制 面对非常大的数字的时候
思路:
- int存不了很大的数字 同样 long long int也无能为力。所以用字符串存。
- 先把十六进制转为二进制。示例中我给出了一种 还算是比较高效的方式。使用位运算。
- 二进制转八进制 我的方法很简单。如果二进制串长度正好是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;
}
}
截图(算的还是蛮快的):