进制转换——36进制

题目:进制转换类

题目描述

将M进制的数X转换为N进制的数输出。

输入

第一行,一个整数T,代表测试数据组数。
接着T行,输入32位二进制数

输出

输出X的N进制表示的数。

测试样例
输入

10 2
11

输出

1011

注意:注意输入时如有字母,则字母为大写,输出时如有字母,则字母为小写。


刚一看题,懵了,以前哪里听过三十六进制,吓坏我了,不过当你了解三十六进制就是所谓的 16进制后面用 G H I … Z 后,便豁然开朗了(ง •̀_•́)ง

思路:

1、先处理输入过程,赋值给相应的值
2、将M进制的X转换为10进制
3、将10进制数转换为N进制
4、输出处理

程序如下:

#include <iostream>
#include <stack>
#include <math.h>
using namespace std;
/**
 * 一个十进制整数转换为N进制之间的任意进制数输出
 * @param ary :要转换的进制
 * @param num :要转换的数
 */
void Dec_To_All(int ary, long long int num) {
    int temp = 0;
    stack<char> number_stack;
    if (ary <= 36 || ary > 1) {                         //不满足条件则退出
        if (ary > 1 && ary < 10) {                      //2-9进制
            while (1) {
                temp = num % ary;                       //进制转换
                number_stack.push(temp + '0');          //压栈,这里需要加上 '0' 因为栈定义为char类型
                num = num / ary;                        //计算剩余数
                if (num == 0)
                    break;
            }
        } else if (ary == 10)                            //10进制
            cout << num << endl;
        else if (ary > 10 && ary < 36) {                  //11-36进制
             while (1) {
                temp = num % ary ;                      //进制转换
                if(temp > 9)
                    temp = temp - 10 + 'a';             //设置为a 开始,输出为a
                else
                    temp = temp + '0';                  //这里转换为字符
                number_stack.push(temp);                //压栈
                num = num / ary;                        //计算剩余数
                if (num == 0)
                    break;
            }
        }
        while (!number_stack.empty()) {
            cout << number_stack.top();             	//得到栈顶元素
            number_stack.pop();                     	//出栈
        }
    }
}
/**
 * 任意进制转换为10进制
 * @param ary 目前的进制数
 * @param num 要转换的数
 * @return
 */
long long int All_to_Dec(int ary, string num) {
    long long int result = 0;
    long long int temp = 0, i = 0;
    if (ary > 36 || ary < 0)
        return 0;
    for (int j = 0; j < num.size(); ++j) {
        if (num[j] >= '0' && num[j] <= '9') {
            temp = (num[j] - '0') * pow(ary, num.size() - 1 - j);                   //计算这个字母对应的数字
        } else if (num[j] >= 'A' && num[j] <= 'Z') {
            temp = (num[j] - 'A' + 10) * pow(ary, num.size() - 1 - j);              //计算这个字母对应的数字
        }
        result += temp;
    }
    return result;
}
/**
 * 将M进制的数X转换为N进制的数输出。(2<=M,N<=36)
 */
int main() {
    int M = 0, N = 0;
    string X = "";                                  //要转换的数
    cin >> M >> N;                                  //获取初始进制数M和目标进制数N
    cin >> X;                                       //需要转换的数
    long long int dec_num = All_to_Dec(M, X);       //M进制转换为十进制数,这里需要用long long才能存下
    Dec_To_All(N, dec_num);                         //十进制转换为N进制
    return 0;
}

注意:

  • 使用了栈Stack进行存储,一定要将压入的元素都转换为栈定义的类型
  • 记住‘A’ = 65 ‘a’=97 '0' = 48 这些常用的ASCII码对应的值

End

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章