数制转换(暑假每日一题 16)

求任意两个不同进制非负整数的转换( 2 2 2 进制 ∼ 16 16 16 进制),所给整数在 i n t int int 范围内。

不同进制的表示符号为 ( 0 , 1 , … , 9 , a , b , … , f ) (0,1,…,9,a,b,…,f) 019abf或者 ( 0 , 1 , … , 9 , A , B , … , F ) (0,1,…,9,A,B,…,F) 019ABF

输入格式
输入只有一行,包含三个整数 a , n , b a,n,b anb a a a 表示其后的 n n n a a a 进制整数, b b b 表示欲将 a a a 进制整数 n n n 转换成 b b b 进制整数。

a , b a,b a,b 是十进制整数。

数据可能存在包含前导零的情况。

输出格式
输出包含一行,该行有一个整数为转换后的 b b b 进制数。

输出时字母符号全部用大写表示,即 ( 0 , 1 , … , 9 , A , B , … , F ) (0,1,…,9,A,B,…,F) 019ABF

数据范围
2 ≤ a , b ≤ 16 , 2≤a,b≤16, 2a,b16,
给定的 a a a 进制整数 n n n 在十进制下的取值范围是 [ 1 , 2147483647 ] [1,2147483647] [1,2147483647]

输入样例:

15 Aab3 7

输出样例:

210306

#include<iostream>

using namespace std;

int a, b;
string s;

int get(char & c){
    
    
    
    if('0' <= c && c <= '9') return c - '0';
    return tolower(c) - 'a' + 10;
}

int getTen(int a, string s){
    
    
    
    int res = 0;
    for(int i = 0; i < s.size(); i++)
        res = res * a + get(s[i]);
        
    return res;
}

string trans(int n, int b){
    
    
    
    string res;
    char c;
    while(n){
    
    
        int x = n % b;
        if(x < 10) c = x + '0';
        else c = 'A' + (x - 10);
        res = c + res;
        n /= b;
    }
    return res;
}

int main(){
    
    
    
    cin >> a >> s >> b;
    
    int x = getTen(a, s);
    
    cout << trans(x, b) << endl;
    
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_46456049/article/details/126170727