码迷,mamicode.com
首页 > 其他好文 > 详细

【题解】十六进制转换

时间:2019-01-20 10:27:12      阅读:219      评论:0      收藏:0      [点我收藏+]

标签:data-   click   http   spl   输入输出格式   pac   stat   src   进制   

题目描述

  输入一个不超过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;
}
参考程序

 

【题解】十六进制转换

标签:data-   click   http   spl   输入输出格式   pac   stat   src   进制   

原文地址:https://www.cnblogs.com/kcn999/p/10293962.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!