16進変換-36 16進数

トピック:変換システム

タイトルの説明

Mシステムの数値XをNシステムの出力に変換します。

入力

最初の行である整数Tは、テストデータセットの数を表します。
T行の横に、32ビットの2進数を入力します

アウトプット

XのN系で表される数を出力します。

テストサンプルの
入力

10 2
11

アウトプット

1011

:入力時に文字がある場合は大文字、出力時に文字がある場合は小文字になることに注意してください。


質問を初めて見たときは恥ずかしかったです。過去に16進数を聞いたことはありますか?怖いのですが、16進数がいわゆる16進数だと理解してGHI ... Zを使うと、突然明るくなります( ง•̀_•́)ง

アイデア:

1.最初に入力プロセスを処理し、対応する値に値を割り当てます
2、M-ary Xを10進数
に変換します3、10進数をN-aryに変換します
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;
}

注:

  • スタックはストレージに使用され、プッシュされた要素はスタックで定義されたタイプに変換される必要があります
  • ‘A’ = 65 ‘a’=97 '0' = 48これらの一般的に使用されるASCIIコードに対応する値を覚えておいてください

End

46の元の記事を公開 75を賞賛 50,000以上のビュー

おすすめ

転載: blog.csdn.net/UNIONDONG/article/details/105147868