题解十六进制转换
Posted kcn999
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了题解十六进制转换相关的知识,希望对你有一定的参考价值。
题目描述
输入一个不超过100000位的十六进制数,请转换成八进制数。
注:十六进制数中,字母0-9还对应表示数字0-9,字母"A"(大写)表示10,"B"表示11,..."F"表示15。
比如:十六进制数A10B表示的十进制数是:10∗163+1∗162+0∗161+11∗160=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; }
以上是关于题解十六进制转换的主要内容,如果未能解决你的问题,请参考以下文章
Silverlight 中的十进制转换器无法正确处理丢失焦点