十六进制转八进制

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

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

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

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

样例输入
  2
  39
  123ABC

样例输出
  71
  4435274

题解

  解题操之过急,未把各种情况考虑清楚,修改了很久,希望不要再这样。

#include <iostream>
#include <cstdio>
#include <stdio.h>
#include <vector>
#include <algorithm>
#include <stdlib.h>
#include <string.h>
#include <cmath>
#include <string>
#include <fstream>
using namespace std;

int main(){
    int n;
    string str[10];
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        cin>>str[i];
        string bin;
        string oct;
        for(int j=0;j<str[i].length();j++){
            switch(str[i][j]){
                case '0':bin+="0000";break;
                case '1':bin+="0001";break;
                case '2':bin+="0010";break;
                case '3':bin+="0011";break;
                case '4':bin+="0100";break;
                case '5':bin+="0101";break;
                case '6':bin+="0110";break;
                case '7':bin+="0111";break;
                case '8':bin+="1000";break;
                case '9':bin+="1001";break;
                case 'A':bin+="1010";break;
                case 'B':bin+="1011";break;
                case 'C':bin+="1100";break;
                case 'D':bin+="1101";break;
                case 'E':bin+="1110";break;
                case 'F':bin+="1111";break;
            }
        }
        int leng = bin.length() % 3;
        if(leng != 0){
            string t = bin.substr(0,leng);
            if(t == "1")
                oct += "1";
            else if (t == "10")
                oct += "2";
            else if (t == "11")
                oct += "3";
            else if(t=="01")
                oct += "1"; 
        }
        if(bin.substr(leng,3) == "000")
            leng+=3; 
        for(long long j = leng;j<bin.length();j+=3){
            string t = bin.substr(j,3);
            if(t == "000")
                oct += "0";
            else if (t == "001")
                oct += "1";
            else if(t == "010")
                oct += "2";
            else if(t =="011")
                oct += "3";
            else if(t =="100")
                oct += "4";
            else if(t =="101")
                oct += "5";
            else if(t == "110")
                oct += "6";
            else if(t== "111")
                oct += "7";
        }
        cout<<oct<<endl;
    }
    return 0;
}
原文地址:https://www.cnblogs.com/woxiaosade/p/10312064.html