问题描述
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n(1<=n<=10)。
接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
【注意】
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
【提示】
先将十六进制数转换成某进制数,再由某进制数转换成八进制。
思路:先转成二进制,再变成6进制,由之前的4位一起,变成3位一起
字符串的截取函数substr这个方法,有两个输入参数分别为起始地址和截取的长度。 s2 = s1.substr(0,3)
自己的运行一直不通过,怎么改都不行,如果知道为什么错了,请告诉我一下哈
#include<iostream>
#include<string>
using namespace std;
string chartostring(char a) { //16进制转成2进制
switch(a) {
case '1':
return "0001";
case '2':
return "0010";
case '3':
return "0011";
case '4':
return "0100";
case '5':
return "0101";
case '6':
return "0110";
case '7':
return "0111";
case '8':
return "1000";
case '9':
return "1001";
case 'A':
return "1010";
case 'B':
return "1011";
case 'C':
return "1100";
case 'D':
return "1101";
case 'E':
return "1110";
case 'F':
return "1111";
}
}
int main() {
int n;
cin>>n;
string a[n];//输入的几串数字
string sum[n];//数字转成二进制的结果
for(int i=0; i<n; i++) {
sum[i]="";
}
for(int i=0; i<n; i++) { //输入
cin>>a[i];
}
//将16进制转成2进制
for(int i=0; i<n; i++) {
for(int j=0; j<a[i].length(); j++) {
sum[i]=sum[i]+chartostring(a[i][j]);
}
}
//将2进制转成8进制
for(int i=0;i<n;i++)
{
if(sum[i].length()%3==1)
{
sum[i]="00"+sum[i];
}
else if(sum[i].length()%3==2){
sum[i]="0"+sum[i];
}
int flag=0;
int len=sum[i].length();
for(int j=0;j<=len-2;j+=3)
{
int num=4*(sum[i][j]-'0')+2*(sum[i][j+1]-'0')+(sum[i][j+2]-'0');
if(num)
flag=1;//0为假
if(flag)
cout<<num;
}
cout<<endl;
}
return 0;
}
另外附上100分的代码
#include<stdio.h>
#include<math.h>
#include<string.h>
int temp[410000];
char jz16[110000];
int answer[410000];
int switcha(char a)
{
if(a>='0'&&a<='9')
return a-'0';
else
return a-'A'+10;
}
int main()
{
int n;
int len;
int now;
int i,j,k;
int sum;
scanf("%d",&n);
while(n--)
{
scanf("%s",jz16);
len=strlen(jz16);
for(i=0;i<len;i++)
{
now=switcha(jz16[i]);
for(j=(i+1)*4-1;j>=i*4;j--)
{
temp[j]=now%2;
now/=2;
}
}//一个十六进制变成4个二进制顺着来
memset(answer,0,sizeof(answer));
for(i=len*4-1,sum=0;i>=0;i-=3,sum++)
//三个二进制变成一个八进制逆着来
for(j=i,k=0;j>i-3&&j>=0;j--,k++)
answer[sum]+=temp[j]*(int)pow(2,k);
for(i=sum;;i--)
if(answer[i]!=0)
break;
//注意不输出前面多余的0
for(i=i;i>=0;i--)
printf("%d",answer[i]);
printf("\n");
}
return 0;
}