标签:data- click http spl 输入输出格式 pac stat src 进制
输入一个不超过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; }
标签:data- click http spl 输入输出格式 pac stat src 进制
原文地址:https://www.cnblogs.com/kcn999/p/10293962.html