蓝桥杯训练 十六进制转八进制 (小模拟)

问题描述

  给定n个十六进制正整数,输出它们对应的八进制数。

输入格式

  输入的第一行为一个正整数n (1<=n<=10)。  接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。

输出格式

  输出n行,每行为输入对应的八进制正整数。

注意

  输入的十六进制数不会有前导0,比如012A。  输出的八进制数也不能有前导0。

样例输入

239123ABC

样例输出

714435274题目分析:先转2进制,再转8进制#include <cstdio>#include <string>#include <cmath>#include <iostream>#include <algorithm>using namespace std;int out[1000005];int main(){int n;scanf("%d", &n);while(n–){string s, ans;cin >> s;if(s[0] == '0'){printf("0\n");continue;}int len = s.length();for(int i = len – 1; i >= 0; i–){if(s[i] == '0')ans += "0000";else if(s[i] == '1')ans += "1000";else if(s[i] == '2')ans += "0100";else if(s[i] == '3')ans += "1100";else if(s[i] == '4')ans += "0010";else if(s[i] == '5')ans += "1010";else if(s[i] == '6')ans += "0110";else if(s[i] == '7')ans += "1110";else if(s[i] == '8')ans += "0001";else if(s[i] == '9')ans += "1001";else if(s[i] == 'A')ans += "0101";else if(s[i] == 'B')ans += "1101";else if(s[i] == 'C')ans += "0011";else if(s[i] == 'D')ans += "1011";else if(s[i] == 'E')ans += "0111";else if(s[i] == 'F')ans += "1111";}len = ans.length();if(len % 3 == 1){len += 2;ans += "00";}else if(len % 3 == 2){len += 1;ans += "0";}int cnt = 0;for(int i = 0; i < len; i += 3)out[cnt ++] = (ans[i] – '0') + (ans[i + 1] – '0') * 2 + (ans[i + 2] – '0') * 4;bool flag = false;for(int i = cnt – 1; i >= 0; i–){if(out[i] == 0 && !flag)continue;flag = true;printf("%d", out[i]);}printf("\n");} }

,走走停停,不要害怕错过什么,

蓝桥杯训练 十六进制转八进制 (小模拟)

相关文章:

你感兴趣的文章:

标签云: