codeup|问题 B: 数制转换

题目描述
求任意两个不同进制非负整数的转换(2进制~16进制),所给整数在long所能表达的范围之内。
不同进制的表示符号为(0,1,…,9,a,b,…,f)或者(0,1,…,9,A,B,…,F)。

输入
输入只有一行,包含三个整数a,n,b。a表示其后的n 是a进制整数,b表示欲将a进制整数n转换成b进制整数。a,b是十进制整数,2 =< a,b <= 16。

输出
可能有多组测试数据,对于每组数据,输出包含一行,该行有一个整数为转换后的b进制数。输出时字母符号全部用大写表示,即(0,1,…,9,A,B,…,F)。

样例输入 Copy
4 123 10
样例输出 Copy
27
提示
用字符串存储和表示不同进制的数。

注意点
输入的数可能是11······16进制,因此就需要用字符形式存储。

代码

#include<stdio.h>
#include<string.h>

int main() {
    int a, b;
    char n[1000];
    while (scanf("%d %s %d", &a, n, &b) != EOF) {
        int len = strlen(n);
        long y = 0, product = 1;
        for (int i = len - 1; i >= 0; i--) {
            if (n[i] >= '0' && n[i] <= '9') y += (n[i] - '0') * product;
            else if (n[i] >= 'a' && n[i] <= 'f') y += (n[i] - 'a' + 10) * product;
            else if (n[i] >= 'A' && n[i] <= 'F') y += (n[i] - 'A' + 10) * product;
            product *= a;
        }
        int z[100], num = 0;
        do {
            z[num++] = y % b;
            y = y / b;
        } while (y != 0);
        for (int i = num - 1; i >= 0; i--) {
            if (z[i] >= 0 && z[i] <= 9) printf("%d", z[i]);
            else if (z[i] == 10) printf("A");
            else if (z[i] == 11) printf("B");
            else if (z[i] == 12) printf("C");
            else if (z[i] == 13) printf("D");
            else if (z[i] == 14) printf("E");
            else if (z[i] == 15) printf("F");
        }
        printf("\n");
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_43340821/article/details/113838863
今日推荐