题解十六进制转换

Posted kcn999

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了题解十六进制转换相关的知识,希望对你有一定的参考价值。

题目描述

  输入一个不超过100000位的十六进制数,请转换成八进制数。

  注:十六进制数中,字母0-9还对应表示数字0-9,字母"A"(大写)表示10,"B"表示11,..."F"表示15。

  比如:十六进制数A10B表示的十进制数是:10163+1162+0161+11160=4122710∗163+1∗162+0∗161+11∗160=41227。转换成的八进制数是:

  120413 :因为 1×85+2×84+0×83+4×82+1×81+3×80=412271×85+2×84+0×83+4×82+1×81+3×80=41227。

  提示:考虑它们与二进制表示的关系。

 

输入输出格式

输入格式

  一行,一个十六进制数。没有前导0。(除非是数字0)

 

输出格式

  一行,一个八进制数。没有前导0。(除非是数字0)

 

输入输出样例

输入样例

123ABC

 

输出样例

4435274

 

题解

  这题朴素做法是先转二进制再转八进制,但实际上可以利用163=84的特性来进行转换,分段转十进制再转八进制。

技术分享图片
#include <iostream>
#include <cstdio>
#include <cstring>

#define MAX_N 1000001

using namespace std;

char a[MAX_N];
int len_a;
char b[MAX_N];
int len_b;

int main()
{
    scanf("%s", a);
    len_a = strlen(a);
    for(register int i = len_a - 1; i >= 0; i -= 3)
    {
        int tmp = 0;
        tmp += (a[i] < A ? a[i] - 0 : a[i] - A + 10);
        if(i - 1 >= 0) tmp += (a[i - 1] < A ? a[i - 1] - 0 : a[i - 1] - A + 10) * 16;
        if(i - 2 >= 0) tmp += (a[i - 2] < A ? a[i - 2] - 0 : a[i - 2] - A + 10) * 256;
        for(register int j = 0; j < 4; ++j)
        {
            b[++len_b] = tmp % 8 + 0;
            tmp /= 8;
        }
    }
    while(len_b > 1 && b[len_b] == 0) len_b--;
    for(register int i = len_b; i > 0; --i)
    {
        putchar(b[i]);
    }
    return 0;
}
参考程序

 

以上是关于题解十六进制转换的主要内容,如果未能解决你的问题,请参考以下文章

题解 P1017 进制转换

P1017 进制转换

Silverlight 中的十进制转换器无法正确处理丢失焦点

题解报告:hdu 1230 火星A+B

第十三届蓝桥杯省赛C++B组 真题题解(详细讲解+代码分析)看这篇就够了~~~

第十三届蓝桥杯省赛C++B组 真题题解(详细讲解+代码分析)看这篇就够了~~~