问题描述
给定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");} }
,走走停停,不要害怕错过什么,