问题描述 给定n个十六进制正整数,输出它们对应的八进制数。
输入格式 输入的第一行为一个正整数n (1<=n<=10)。 接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式 输出n行,每行为输入对应的八进制正整数。
【注意】 输入的十六进制数不会有前导0,比如012A。 输出的八进制数也不能有前导0。
样例输入 2 39 123ABC
样例输出 71 4435274
【提示】 先将十六进制数转换成某进制数,再由某进制数转换成八进制。
之所以要贴出来是因为错了很多次,最后发现是输出错了。。。
#include <iostream>#include <cstring>#include <string>#include <vector>#include <queue>#include <cstdio>#include <set>#include <cmath>#include <algorithm>#include <queue>#define INF 0x3f3f3f3f#define MAXN 10000005#define Mod 10001using namespace std;string num1;string change(char e){ string low[]= {"0000","0001","0010","0011","0100","0101","0110","0111","1000","1001"}; if(e<='9'&&e>='0') return low[e-'0']; if(e=='A') return "1010"; if(e=='B') return "1011"; if(e=='C') return "1100"; if(e=='D') return "1101"; if(e=='E') return "1110"; if(e=='F') return "1111";}int ans[MAXN];int main(){ string tmp; int n; scanf("%d",&n); while(n--) { cin>>num1; tmp=""; int len=num1.length(); for(int i=0; i<len; ++i) tmp+=change(num1[i]); len=tmp.size(); if(len%3==2) tmp="0"+tmp; if(len%3==1) tmp="00"+tmp; len=tmp.length(); int sum=0,p=0; for(int i=0; i<=len-2; i+=3) { sum=(tmp[i]-'0')*4+(tmp[i+1]-'0')*2+(tmp[i+2]-'0'); ans[p++]=sum; } for(int i=0; i<p; ++i) { if(i==0&&ans[i]==0) continue; cout<<ans[i]; } cout<<endl; } return 0;}新闻热点
疑难解答