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;
}