十六进制转八进制 蓝桥杯

Description

给定n个十六进制正整数,输出它们对应的八进制数。

Input

输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。

Output

输出n行,每行为输入对应的八进制正整数。

Sample Input

2
39
123ABC

Sample Output

71
4435274

Hint

提示
先将十六进制数转换成某进制数,再由某进制数转换成八进制。

Source

蓝桥杯
 
先将十六进制转化成二进制,再将二进制转化成八进制,开始在转化成八进制的时候没有判断最后只剩两位或者一位的情况导致WA几次。。。。
 
#include<cstdio>
#include<iostream>
#include<cstring>
#include<string>
#include<cstdlib>
#include<queue>
#include<cmath>
#include<algorithm>
#define debug(a) cout << #a << " " << a << endl
using namespace std;
typedef long long ll;
int s2[10000000],tmp[10000000];
int main() {
    int T;
    cin >> T;
    while( T -- ) {
        int n = 0, j = 0;
        string s1;
        cin >> s1;
        memset( s2, 0, sizeof(s2) );
        memset( tmp, 0, sizeof(tmp) );
        for( int i = s1.length()-1; i >= 0 ; i -- ) {
            int t, k = s1.length() - i - 1;
            if( s1[i] >= 'A' && s1[i] <= 'F' ) {
                t = s1[i] - 'A' + 10;
            } else {
                t = s1[i] - '0';
            }
            int cnt = 0;
            //debug(t);
            while( t ) {
                if( t % 2 == 1 ) {
                    if( j < 4*k+cnt ) {
                        j = 4*k+cnt;
                    }
                }
                s2[4*k+cnt] = t % 2;
                t /= 2;
                cnt ++;
            }
        }
        int k = 0;
        for( int i = 0; i <= j; i ++ ) {
            if( ( i + 1) % 3 == 0 ) {
                tmp[k++] = s2[i]*4 + s2[i-1]*2 + s2[i-2];
            } else if( i == j ) {
                if( ( i + 1) % 3 == 2 ) {
                    tmp[k++] = s2[i]*2 + s2[i-1];
                } else if( ( i + 1 ) % 3 == 1 ) {
                    tmp[k++] = s2[i];
                }
            }
        }
        for( int i = k-1; i >= 0; i -- ) {
            cout << tmp[i];
        }
        cout << endl;
    }
    return 0 ;
}

 

posted on 2018-03-08 21:12  九月旧约  阅读(190)  评论(0编辑  收藏  举报

导航