十六进制数转八进制 大数转化
题目:
问题描述
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
注意
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
39
123ABC
样例输出
71
4435274
4435274
思路: 先转化为2进制,然后再转化为八进制。
数学上容易证明,2进制和十六进制的转化就是美4位取一为一组。 转化为8进制就是每3位取为一组。
由于4*n=n(mod3),所以要对length对3的余数进行讨论。
代码:
#include<iostream>
#include<vector>
#include<string>
using namespace std;
int getDigit(char c)
{
if(c=='0') return 0;
else if(c=='1') return 1;
else if(c=='2') return 2;
else if(c=='3') return 3;
else if(c=='4') return 4;
else if(c=='5') return 5;
else if(c=='6') return 6;
else if(c=='7') return 7;
else if(c=='8') return 8;
else if(c=='9') return 9;
else 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;
return -1;
}
int p[100000];
int q[400000];
int r[100000];
int g[3]={1,2,4};
int main()
{
int n;
cin>>n;
string s;
while(n--)
{
cin>>s;
int length=s.length();
{
for(int i=0;i<length;i++)
p[i]=getDigit(s[i]);
for(int i=0;i<length;i++)
{
for(int j=3;j>=0;j--)
{
q[4*i+j]=p[i]%2;
p[i]/=2;
}
}
// for(int i=0;i<4*length;i++)
// cout<<q[i]<<" ";
// cout<<endl;
//
if(length%3==0)
{
bool flag=0;
for(int i=0;i<4*length;i+=3)
{
int temp=0;
for(int j=2;j>=0;j--)
{
temp+=g[j]*q[i+2-j];
}
if(flag==0&&temp)
{ cout<<temp;
flag=1;
}
else cout<<temp;
}
cout<<endl;
}
else if(length%3==1)
{
bool flag=0;
if(q[0])
{
cout<<q[0];
flag=1;
}
for(int i=1;i<4*length;i+=3)
{
int temp=0;
for(int j=2;j>=0;j--)
{
temp+=g[j]*q[i+2-j];
}
if(flag==0&&temp)
{ cout<<temp;
flag=1;
}
else cout<<temp;
}
cout<<endl;
}
else if(length%3==2)
{
bool flag=0;
if(q[0]*2+q[1])
{
cout<<q[0]*2+q[1];
flag=1;
}
for(int i=2;i<4*length;i+=3)
{
int temp=0;
for(int j=2;j>=0;j--)
{
temp+=g[j]*q[i+2-j];
}
if(flag==0&&temp)
{ cout<<temp;
flag=1;
}
else cout<<temp;
}
cout<<endl;
}
}
}
}
posted on 2014-03-05 01:53 814jingqi的ACM 阅读(538) 评论(0) 收藏 举报
浙公网安备 33010602011771号