zoukankan      html  css  js  c++  java
  • 基础练习 ——十六进制转八进制

    资源限制
    时间限制:1.0s   内存限制:512.0MB
    问题描述
      给定n个十六
    进制正整数,输出它们对应的八进制数。
    输入格式
      输入的第一行为一个正整数n (1<=n<=10)。
      接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
    输出格式
      输出n行,每行为输入对应的八进制正整数。
      【注意
      输入的十六进制数不会有前导0,比如012A。
      输出的八进制数也不能有前导0。
    样例输入
      2
      39
      123ABC
    样例输出
      71
      4435274
      提示
      先将十六进制数转换成某进制数,再由某进制数转换成八进制。

    主要思想如下:
    1、十六进制不能直接转八进制,需要借助二进制,先将十六进制转化为二进制。
    2、三位二进制对应一位八进制数,上面步骤一转化的不一定正好是三的倍数,不是的话应该在前面补0。
    3、每三位二进制数转化为一位八进制数。
    如十六进制数:A,转化为二进制1010,补:001010,得八进制数12。

    #include <iostream>
    #include <string>
    using namespace std;
    int arr[10000001];
    int main()
    {
        int n, lengt, i, j;
        string str, str2;
        cin >> n;
        while (n--)
        {
            cin >> str;
            lengt = str.length();
            str2 = "";
            //将十六进制的数转化为二进制的数
            for (i = 0; i<lengt; ++i)
            {
                switch (str[i])
                {
                case '0':str2 += "0000"; break;
                case '1':str2 += "0001"; break;
                case '2':str2 += "0010"; break;
                case '3':str2 += "0011"; break;
                case '4':str2 += "0100"; break;
                case '5':str2 += "0101"; break;
                case '6':str2 += "0110"; break;
                case '7':str2 += "0111"; break;
                case '8':str2 += "1000"; break;
                case '9':str2 += "1001"; break;
                case 'A':str2 += "1010"; break;
                case 'B':str2 += "1011"; break;
                case 'C':str2 += "1100"; break;
                case 'D':str2 += "1101"; break;
                case 'E':str2 += "1110"; break;
                case 'F':str2 += "1111"; break;
                default:break;
                }
            }
            //因为二进制转化为八进制是三位三位的计算,所以对3取余。然后根据具体情况向前补零
            if (lengt % 3 == 1) str2 = "00" + str2;
            else if (lengt % 3 == 2) str2 = "0" + str2;
            lengt = str2.length();
            j = 0;
            //解决位数问题以后,开始从前往后进行二进制到八进制的转化
            for (i = 0; i <= lengt - 2; i += 3)
            {
                arr[j] = (str2[i] - '0') * 4 + (str2[i + 1] - '0') * 2 + (str2[i + 2] - '0');
                ++j;
            }
            //判断前导是否为零,若为零跳过,直到不为零正序输出
            for (i = 0; i<j; ++i)
            {
                if (i == 0 && arr[i] == 0) continue;
                cout << arr[i];
            }
            cout << endl;
        }
        return 0;
    }
     
  • 相关阅读:
    C# 缩略图算法
    2018年上半年软件测试助教小结
    HUST软工1501-1503班第4周作业成绩公布
    HUST软工1501-1503班第2周作业成绩公布
    HUST软工1505班第0周作业成绩公布
    软件质量与测试2018春第0周作业1:开设博客
    Spring boot配置拦截器(Interceptor)和监听器(Listener)
    Hangman Judge UVA
    策略路由 policy routing rt_tables
    汇编及逆向基础杂记
  • 原文地址:https://www.cnblogs.com/wlyperfect/p/12489439.html
Copyright © 2011-2022 走看看