问题描述
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由09、大写字母AF组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
【注意】
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
【提示】
先将十六进制数转换成某进制数,再由某进制数转换成八进制。
正确答案:
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,i,m=0,j,k,l,c=0,g;
int f[400001];
char s[14],a[100001];
char map[16][5]={"0000","0001","0010","0011","0100","0101",
"0110","0111","1000","1001","1010","1011","1100","1101","1110","1111"};
cin>>n;
for(int t=0;t<n;t++)
{
scanf("%s",a);
k=0;c=0;g=0;
s[0]='\0';
l=strlen(a);
j=l%3;
if(j!=0)j=3-j;
if(j==1)
{
strcat(s,"0000");
k+=4;
}
else if(j==2)
{
strcat(s,"00000000");
k+=8;
}
for(i=0;i<l;i++)
{
if(a[i]>=65)
m=a[i]-55;
else
m=a[i]-48;
strcat(s,map[m]);
k+=4;
if(k==12)
{
for(int t=0;t<12;t+=3)
{
f[c]=(s[t]-'0')*4+(s[t+1]-'0')*2+s[t+2]-'0';
c++;
}
k=0;
s[0]='\0';
}
}
for(i=0;i<c;i++)
{
if(!(g==0&&f[i]==0))
{
printf("%d",f[i]);
g=1;
}
}
cout<<endl;
}
}
第一遍错误超时代码:
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
vector<int> b;
void fb(char a)
{
int n,sum=0;
vector<int> c;
if(a>=65)
n=a-55;
else
n=a-48;
// cout<<n<<endl;
while(n>0)
{
c.push_back(n%2);
n/=2;
sum++;
}
for(int i=0;i<4-sum;i++)
b.push_back(0);
for(int i=c.size()-1;i>=0;i--)
b.push_back(c[i]);
}
int main()
{
int n,i,m=0,j;
char a[100001];
int c[100001];
cin>>n;
for(int t=0;t<n;t++)
{
scanf("%s",a);
int k=0;
for( j=0;j<strlen(a);j++)
fb(a[j]);
m=b.size()%3;
if(m!=0)
b.insert(b.begin(),3-m,0);
for(i=0;i<b.size();i+=3)
{
for(j=i;j<i+3;j++)
c[k]=c[k]+(b[j]*pow(2,3-j+i-1));
k++;
}
// for(j=0;j<b.size();j++)
// cout<<b[j];
// cout<<endl;
int f=0;
for(j=0;j<b.size()/3;j++)
{
if(f==0)
{
if(c[j]!=0)
printf("%d",c[j]);
f=1;
}
else
{
printf("%d",c[j]);
f=1;
}
}
cout<<endl;
memset(a,0,sizeof(a));
memset(c,0,sizeof(c));
b.clear();
}
}
来源:CSDN
作者:“黎明”
链接:https://blog.csdn.net/weixin_43382740/article/details/103568265