N-43. 简单进制转换

放在c语言课上也是水题
题目描述:

进位制在生活中的运用非常频繁,比方说7进制,10进制,还有60进制等,下面请聪明的你对于简单的2-16进制的数字进行运算。

我们将给出每一组的数据和对应的进制,请你将数据转化为十进制,并按照先进制(由大到小)后大小(由大到小)的顺序排列出来。

注:在11 ~ 16进制中,a ~ f分别表示10 ~ 15。

输入格式:

第1行输入数据的组数n

第2~n+1行,每一行输入一个字符串一个整数。代表数字及其进制。

输出格式:

第1~n行,每一行输出两个整数。前一个代表数值的十进制,后一个代表它原有的进制。


进行两次冒泡排序即可,先比较进制大小,再比较数大小
记得开long long

#include <stdio.h>  
#include <math.h>  
#include <string.h>  
#define ll long long  
char ch[110][10];  
int a[110]; ll ans[110] = {0};  
int main () {  
    int n;  
    scanf("%d", &n);  
    for (int i = 1; i <= n; i++) scanf("%s%d", ch[i], &a[i]);  
    for (int i = 1; i <= n; i++) {  
        for (int j = strlen(ch[i]) - 1; j >= 0; j--) {  
            if (ch[i][j] >='a' && ch[i][j] <= 'j') ans[i] += (ch[i][j] - 'a' + 10) * pow(a[i], strlen(ch[i]) - 1 - j);  
            else ans[i] += (ch[i][j] - '0') * pow(a[i], strlen(ch[i]) - 1 - j);  
        }  
    }  
    for (int i = 1; i <= n ; i++) {  
        for (int j = 1; j < n; j++) {  
            if (a[j] < a[j + 1]) {  
                int temp1 = ans[j], temp2 = a[j];  
                ans[j] = ans[j + 1], a[j] = a[j + 1];  
                ans[j + 1] = temp1, a[j + 1] = temp2;  
            }  
        }  
    }  
    for (int i = 1; i <= n; i++) {  
        for (int j = 1; j < n; j++) {  
            if (a[j] == a[j + 1] && ans[j] < ans[j + 1]) {  
                int temp1 = ans[j], temp2 = a[j];  
                ans[j] = ans[j + 1], a[j] = a[j + 1];  
                ans[j + 1] = temp1, a[j + 1] = temp2;  
            }   
        }  
    }  
    for (int i = 1; i <= n; i++) printf("%lld %d\n", ans[i], a[i]);  
    return 0;  
}  
posted @ 2022-04-27 17:43  misasteria  阅读(249)  评论(0编辑  收藏  举报