十六进制转八进制

来源:互联网 发布:淘宝小二是什么意思 编辑:程序博客网 时间:2024/06/07 18:31

问题描述

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


输入格式

  输入的第一行为一个正整数n (1<=n<=10)。

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


输出格式

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

  【注意】  输入的十六进制数不会有前导0,比如012A。

  输出的八进制数也不能有前导0。


样例输入

  2

  39

  123ABC


样例输出

  71

  4435274

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



一开始没考虑数据的大小,写了十六进制 -> 十进制 -> 八进制,代码如下

#include <iostream>#include <string>#include <math.h>using namespace std;const int N = 10;string A[N];void hexToOct (int n){    int temp; // temp为十进制数    int x;    char c;int wei; // wei为十六进制的位数    for (int i = 0; i < n; i++)    {        temp = 0;        int j = 0;        c = A[i][j];wei = 0;        while ((c >= '0' && c <= '9') || (c >= 'A' && c <= 'F'))        {j++;            c = A[i][j];wei++;}j = 0;c = A[i][j];while (wei){if (c >= 'A' && c <= 'Z')                x = c - 'A' + 10;elsex = c - '0';            temp = temp + x*pow (16, wei - 1);            j++;            c = A[i][j];--wei;}j = 0;int b = 0;while (temp){x = temp % 8;temp /= 8;j++;b = b + x*pow(10, j-1);}cout << b << endl;    }}int main (){    int n;    cin >> n;    for (int i = 0; i < n; i++)        cin >> A[i];    hexToOct (n);    return 0;}



改进了一下,十六进制 -> 二进制 -> 八进制,但还是敌不过大型数据的输入

#include <iostream>#include <string>#include <math.h>using namespace std;const int N = 10;string A[N];void ToOct (string B, int wei){    string C;    int i = 0;    int s = 0;    wei = wei * 4;    int j = wei % 3;    if (j == 1)        if (B[0] == '1')            cout << "1";    if (j == 2)    {        C.assign(B, 0, 2);        if (!C.compare ("01"))            cout << '1';        else if (!C.compare ("10"))            cout << '2';        else if (!C.compare ("11"))            cout << '3';    }    C = ""; // 清空C    for (i = j; i < wei; i += 3)    {        C.assign(B, i, 3); // 将字符串B的第i位开始3个字符赋给字符串C        if (!C.compare ("000") && i != 0)            cout << '0';        else if (!C.compare ("001"))            cout << '1';        else if (!C.compare ("010"))            cout << '2';        else if (!C.compare ("011"))            cout << '3';        else if (!C.compare ("100"))            cout << '4';        else if (!C.compare ("101"))            cout << '5';        else if (!C.compare ("110"))            cout << '6';        else if (!C.compare ("111"))            cout << '7';        C = ""; // 清空C    }    cout << endl;}void ToBin (int n){    string B;    cout << "B max is " << B.max_size() << endl;    char c;    for (int i = 0; i < n; i++)    {        int j = 0;        c = A[i][j];        while ((c >= '0' && c <= '9') || (c >= 'A' && c <= 'F'))        {            switch (c)            {                case '0': B = B + "0000"; break;                case '1': B = B + "0001"; break;                case '2': B = B + "0010"; break;                case '3': B = B + "0011"; break;                case '4': B = B + "0100"; break;                case '5': B = B + "0101"; break;                case '6': B = B + "0110"; break;                case '7': B = B + "0111"; break;                case '8': B = B + "1000"; break;                case '9': B = B + "1001"; break;                case 'A': B = B + "1010"; break;                case 'B': B = B + "1011"; break;                case 'C': B = B + "1100"; break;                case 'D': B = B + "1101"; break;                case 'E': B = B + "1110"; break;                case 'F': B = B + "1111"; break;            }            j++;            c = A[i][j];        }        // cout << B << endl; //输出二进制数        ToOct(B, j); // 二进制转化为八进制函数        B = "";    }}int main (){    int n;    cin >> n;    for (int i = 0; i < n; i++)        cin >> A[i];    ToBin (n);    return 0;}


0 0