美文网首页
基础练习-十六进制转八进制

基础练习-十六进制转八进制

作者: 嘉敏的豆子 | 来源:发表于2018-03-20 20:43 被阅读0次

题目要求

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

解题过程

这个题想了很久,知道16进制就是加四位,算八进制就是提出三位来,但是我写的时候吧这个加了一个算十进制的过程,所以当输入的十六进制数特别特别大的时候,这个时候是没办法在转变为十进制数的。
这个是网上学习的代码,先记录下来吧。

#include <stdio.h>
#include <iostream>
#include <cmath>
#include <string>
using namespace std;
typedef long long ll;
int main(){
    int n;
    cin>>n;
    string s1[12],s2[12];
    for(int i = 0;i<n;i++){
        cin>>s1[i];
    }
    for(int i = 0;i<n;i++){
        s2[i]="";
        for(int j = 0;j<s1[i].length();j++){
            switch (s1[i][j]) {
                case '0' : s2[i] += "0000"; break;
                case '1' : s2[i] += "0001"; break;
                case '2' : s2[i] += "0010"; break;
                case '3' : s2[i] += "0011"; break;
                case '4' : s2[i] += "0100"; break;
                case '5' : s2[i] += "0101"; break;
                case '6' : s2[i] += "0110"; break;
                case '7' : s2[i] += "0111"; break;
                case '8' : s2[i] += "1000"; break;
                case '9' : s2[i] += "1001"; break;
                case 'A' : s2[i] += "1010"; break;
                case 'B' : s2[i] += "1011"; break;
                case 'C' : s2[i] += "1100"; break;
                case 'D' : s2[i] += "1101"; break;
                case 'E' : s2[i] += "1110"; break;
                case 'F' : s2[i] += "1111"; break;
                default:
                    break;
            }
        }
        if(s2[i].length()%3==1) s2[i] = "00" + s2[i];
        else if(s2[i].length()%3==2) s2[i] = "0" + s2[i];
        int flag = 0;
        for(int j = 0;j<=s2[i].length()-3;j+=3){
            int num = 4*(s2[i][j]-'0')+2*(s2[i][j+1]-'0')+(s2[i][j+2]-'0');
            if(num) flag = 1;
            if(flag) cout<<num;
        }
        cout<<endl;
    }
    
    return 0;
}

相关文章

网友评论

      本文标题:基础练习-十六进制转八进制

      本文链接:https://www.haomeiwen.com/subject/lxhiqftx.html