十六进制转换八进制

问题描述

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

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

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

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

样例输入
  2
  39
  123ABC

样例输出
  71
  4435274

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

代码如下

#include <stdio.h>
#include<string.h>
int x2i(char c)
{
    if (c >= 'A') 
        return c - 55;
    else 
        return c - 48;
}

int main()
{
    int i, j, n;
    char a[10][100001];
    scanf("%d", &n);
    for (i = 0; i < n; i++)
        scanf("%s", a[i]);
    for (i = 0; i < n; i++)
    {
        char* p = a[i];
        int len = strlen(p);
        if (len % 3 == 1)
        {
            printf("%o", x2i(p[0]));
            j = 1;
        }
        else if (len % 3 == 2)
        {
            printf("%o", x2i(p[0])*16+x2i(p[1]));
            j = 2;
        }
        else
        {
            printf("%o", x2i(p[0])*256+x2i(p[1])*16+x2i(p[2]));
            j = 3;
        }
        for (; j < len; j += 3)
            printf("%04o", x2i(p[j])*256+x2i(p[j+1])*16+x2i(p[j+2]));
        printf("\n");
    }
    return 0;
}

思考

读取字符串可以用scanf的%s读取,获取字符串的长度可以用strlen函数,它的头文件为《string.h》,最后就是注意十六进制中字母部分减去55,数字减去48就是对应的十进制数

运行截图

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_42837885/article/details/84628999