------------只要够努力,人生最坏的结局不过是大器晚成!!!

                  十六进制转八进制

http://lx.lanqiao.cn/problem.page?gpid=T51

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

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

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

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

样例输入
  2
  39
  123ABC

样例输出
  71
  4435274

思路:由十六进制转八进制利用二进制位相互转化,十六进制是4个二进制位,八进制是3个二进制位。将是十六位的数每位化为4位的二进制,在3位一结合转为八进制即可。

//如果注释掉第27行会报错??????

#include <iostream> #include <algorithm> #include <cstdio> #include <cstring> using namespace std; string str; string two[17] = {"0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111", "1000", "1001", "1010", "1011", "1100", "1101", "1110", "1111"}; int main(){ int n; cin >> n; while(n--){ cin >> str; string ss; string ans; for(int i = 0; i < str.length(); i++){ if(str[i] >= '0' && str[i] <= '9'){ ss += two[str[i] - '0']; } else{ ss += two[str[i] - 'A' + 10]; } } // cout << ss << endl; //dev如果注释掉这一行,就崩了,莫名其妙,但注释掉,直接交就可以ac int sum = 0; for(int i = ss.length() - 1; i >= 0; i--){ if(i == 1){ // if(ss[i] == '0' && ss[i - 1] == '0'){ //避免产生前置0 // break; // } sum = (ss[i] - '0') * 1 + (ss[i - 1] - '0') * 2; ans += (sum + '0'); break; } else if(i == 0){ // if(ss[i] == '0'){ //避免产生前置0 // break; // } sum = (ss[i] - '0') * 1; ans += (sum + '0'); break; } else{ sum = (ss[i] - '0') * 1 + (ss[i - 1] - '0') * 2 + (ss[i - 2] - '0') * 4; ans += (sum + '0'); i -= 2; } } int flag = 0; for(int i = ans.length() - 1; i >= 0; i--){ char ch = ans[i]; if(ch != '0' || flag == 1){ //如果前面有前置0的情况,则要去0 cout << ans[i]; flag = 1; } } cout << endl ; } return 0; }

  

 

posted on 2018-01-29 19:55  ystraw  阅读(169)  评论(0编辑  收藏  举报

不经一番切孤寒,怎得梅花扑鼻香