题目描述
输入一个不超过100000位的十六进制数,请转换成八进制数。
输入输出格式
输入格式
一行,一个十六进制数。没有前导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; }