问题描述
给定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
提示
先将十六进制数转换成某进制数,再由某进制数转换成八进制。
#include<stdio.h>
//#include<iostream>
#include<string.h>
//using namespace std;
//注释部分 当时用来调试的
const int maxn = 400000 + 5;
const int maxn2 = 100000 + 5;
char s[maxn2];
int d[maxn], b[4], _count;
int flag;
void init() {
memset(s, '\0', sizeof(s));
memset(d, 0, sizeof(d));
memset(b, 0, sizeof(b));
_count = 0;
}
int c_d(int ch) {
if(ch >= 'A' && ch <= 'F') return (ch -'A' +10);
else return (ch - 48);
}
void chu(int x, int* b, int cs) {
int bcs = x, sz, cnt = 4;
//memset(b, 0, sizeof(b)); //为什么这样的初始化不行
b[0] = b[1] = b[2] = b[3] = 0; //这样初始化就成功了
while(sz = (bcs/cs)) {
b[--cnt] = bcs%cs;
bcs = sz;
//cout << "___" << cnt << "____" << endl;
}
b[--cnt] = bcs%cs; // 问题就是出在这儿了 如果算出来的位数不满足4位的话应该要处理一番
//int bz = 3-cnt; // bz 表示不足的位数 刚好就是cnt的数值
//cout << " 不足的位数 " << bz << endl;
/* for(int i = bz-1, j = 3; i >=0 && j >= bz && cnt != 0; i--, j--) { //移位次数
b[j-bz] = b[cnt];
cnt--;
}
//移位结束之后就用0填充所有剩下的空位
for(int i = 3; i >= 4-bz; i--) b[i] = 0;
*/ //本就无需移位操作,,,,是自己思路不清晰
}
int bq(int x) {
return 3-x%3;
}
int main() {
int N, sum;
while(scanf("%d", &N) != EOF) {
for(int i = 0; i < N; i++) {
init();
scanf("%s",s);
for(int j = strlen(s)-1; j >= 0; j--) {
// memset(d, 0, sizeof(d));
flag = 0;
chu(c_d(s[j]), b, 2);
//cout << s[j] << "-----" << c_d(s[j]) << " b[0] -- > b[3] " << b[0] << " " << b[1] << " " << b[2] << " " << b[3] << endl;
for(int k = 3; k >= 0; k--) // 注意i j k 这些for循环中的变量
{
//cout << d[_count] << " **** ";
d[_count++] = b[k];
//cout << " " << " b[i] " << b[i] << " _count " << _count << " " << d[_count-1] << " ..上面.. " << endl;
}
}
_count = _count + bq(_count); //统计好所需要的数组元素个数
//cout << _count << " ----___---- " << endl;
//for(int i = 0; i < _count; i++) cout << " " << d[i] << " ";
// cout << endl;
int _cs = _count/3;
for(int j = 0; j < _cs; j++) {
sum = d[_count-1]*4 + d[_count-2]*2 + d[_count-3];
_count -= 3;
// printf("%d", sum); //注意还不能有前导0 否则这里应该用while写一个判断 待定!
if(!flag && !sum) continue;
else {flag = 1; printf("%d", sum);
}
}
printf("\n");
}
}
return 0;
}
//大爷的 ,这题搞得哥哥我差点儿吐血
说到底 还是我太水了。。。。