先将十六进制数转换成某进制数,再由某进制数转换成八进制。
#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; } //大爷的 ,这题搞得哥哥我差点儿吐血
原文地址:http://blog.csdn.net/czkct/article/details/45664435