[蓝桥杯]十六进制转八进制

来源:互联网 发布:淘宝怎样进行实名认证 编辑:程序博客网 时间:2024/05/29 04:24

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

  • 问题描述
  • 代码
  • 代码分析

问题描述

问题描述
  给定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 <cmath>#include <vector>using namespace std;int main(void){    int n;//个数    cin>>n;    for(int i = 0; i < n; ++i)    {//对输入的n个数逐个操作        vector<int> v;        string s;        cin>>s;        int m = s.length();        //16 转 2        for(int j = 0; j <m;++j)        {            char tmp = s.at(j);            if( tmp >= '0' && tmp <= '9')            {//对0-9处理                vector<int> t;                int a = tmp - '0';                //将每个十六进制转成二进制逆序输入临时vector t中                //比如2 转成二进制直接输入是 0100 输入v中                for(int k = 0; k < 4; ++k)                {                    if( a != 0)                    {                        t.push_back(a%2);                        a /= 2;                    }                    else//对未输出满4位的进行补0                    {                        t.push_back(0);                    }                }                //将v向量中的二进制逆序输回v向量                //比如 2->t:0100->v:0010                for(int k = t.size()-1; k >= 0;--k)                {                    v.push_back(t[k]);                }            }            else            {//对A-F进行同样的处理                vector<int> t;                int a = tmp - 'A' + 10;                while( a != 0)                {                    t.push_back(a%2);                    a /= 2;                }                for(int k = t.size()-1; k >= 0;--k)                {                    v.push_back(t[k]);                }            }        }        // for(int j = 0; j < v.size();++j)        //     cout<<v[j];        // cout<<endl;        //对未满3的整数位的v向量补0        //因为每三位转换成8进制        int s_v = v.size();        int m_v = s_v % 3;        if(m_v == 1)            {            v.insert(v.begin(),0);            v.insert(v.begin(),0);                    }        if(m_v == 2)        {             v.insert(v.begin(),0);        }        //2 转 8        vector<int> oct;        for(int j = 0; j < v.size(); j+=3)        {            int o_tmp = v[j] * 4 + v[j+1]*2 + v[j+2]*1;            if(oct.size() != 0 || o_tmp != 0)//将前置0全部忽略掉                oct.push_back(o_tmp);        }        for(int j = 0; j < oct.size();++j)            cout<<oct[j];        cout<<endl;    }    return 0;}

代码分析

原创粉丝点击