您的位置:首页 > 其它

基础练习 十六进制转八进制

2018-02-07 21:19 183 查看
本题关键是两个部分,一个是将16进制转化为2进制存储,然后再将2进制数转化为8进制进行存储,另外注意末尾不足3位的情况和去掉8进制前导为0的情况就行了,一个子函数用来计算2的n次方,易错点:忘了初始化存储数字的数组导致wa

#include<cstdio>
#include<stack>
#include<iostream>
#include<cstring>
using namespace std;
const int maxn=400000+100;
int a[maxn];
int fri(int n)//计算2的次方
{
int sum=1;
if(n==0)
return sum;
for(int i=0;i<n;i++)
{
sum*=2;
}
return sum;
}
int main()
{
int t;char s[maxn];
//freopen("2.txt","r",stdin);
scanf("%d",&t);
while(t--)
{
scanf("%s",s);
//转换成2进制的部分
int len=strlen(s);
memset(a,0,sizeof(a));
for(int i=0;i<len;i++)
{
if(s[i]>='0'&&s[i]<='9')
{
int temp=s[i]-'0';
int tap=4*(i+1);
while(temp)
{
a[--tap]=temp%2;
temp/=2;
}
}
else if(s[i]>='A'&&s[i]<='F')
{
int temp=s[i]-55;
int tap=4*(i+1);
while(temp)
{
a[--tap]=temp%2;
temp/=2;
}
}
}
//将 2进制转化成8进制的过程
stack<int> s;int sum=0,cnt=0;
for(int i=4*(len)-1;i>=0;i--)
{
sum+=(a[i]*fri(cnt++));
if(cnt==3)
{
s.push(sum);
cnt=0;sum=0;
}
}
int sum1=0,c=0;
for(int i=4*len%3-1;i>=0;i--)
{
sum1+=(a[i]*fri(c++));
}
if(sum1!=0)
printf("%d",sum1);
while(!s.top())
s.pop();
while(!s.empty())
{
printf("%d",s.top());
s.pop();
}
printf("\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: