N-31. 简单进制转换
今天带来的还是sanyuan毒瘤算法~
题目背景:
进位制在生活中的运用非常频繁,比方说7进制,10进制,还有60进制等,下面请聪明的你对于简单的2-16进制的数字进行运算。
我们将给出每一组的数据和对应的进制,请你将数据转化为十进制,并按照先进制(由大到小)后大小(由大到小)的顺序排列出来。
注:在1116进制中,af分别表示10~15。
输入格式:
第1行输入数据的组数n
第2~n+1行,每一行输入一个字符串一个整数。代表数字及其进制。
输出格式:
第1~n行,每一行输出两个整数。前一个代表数值的十进制,后一个代表它原有的进制。
样例输入1:
7
14 7
1ab 14
100101 2
fff 16
278 7
1001 2
abd 16
样例输出1:
4095 16
2749 1
347 14
155 7
11 7
37 2
9 2
数据范围:
1≤n≤100
1≤字符串长度≤8
代码
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<time.h>
#include<string.h>
int main (){
//第1行输入数据的组数n 第2~n+1行,每一行输入一个字符串一个整数。代表数字及其进制。
//输出格式:第1~n行,每一行输出两个整数。前一个代表数值的十进制,后一个代表它原有的进制。//
int n; int i, j, t; unsigned int sum;
scanf("%d",&n);
char a1[100][10];
int sys[100]; int l[100];
unsigned int dec[100][2];
unsigned int x;
unsigned int m;
for(i=0; i<n; i++){
scanf("%s %d",&a1[i], &sys[i]);//read num //
l[i]=strlen(a1[i]);
}
for(i=0; i<n; i++){
sum=0;
for(j=0; j<l[i]; j++){
if((a1[i][j]<=57)&&(a1[i][j]>=48)){
x=a1[i][j]-48;
}else{
x=a1[i][j]-87;
}
m=pow(sys[i],l[i]-j-1);//m is coefficient//
sum+=m*x;
}dec[i][0]=sum; dec[i][1]=sys[i];
}
//and calculate//
for(i=0; i<n-1; i++){
for(j=0;j<n-1-i;j++){
if(dec[j][1]<dec[j+1][1]){//sort in decending order, bubble,以作为dec[j][1]依据//
t=dec[j][0]; dec[j][0]=dec[j+1][0]; dec[j+1][0]=t;
t=dec[j][1]; dec[j][1]=dec[j+1][1]; dec[j+1][1]=t;
}else if(dec[j][1]==dec[j+1][1]&&(dec[j][0]<dec[j+1][0])){
t=dec[j][0]; dec[j][0]=dec[j+1][0]; dec[j+1][0]=t;
t=dec[j][1]; dec[j][1]=dec[j+1][1]; dec[j+1][1]=t;//也以dec[j][0]作为依据//
}
}
}
//output//
for(i=0; i<n; i++){
printf("%u %u\n",dec[i][0], dec[i][1]);
}
return 0;
}
小结
- 大量应用数组存放变量。
- 输出4294967295要用unsigned, 用long long int也不行。暂时不知为什么。
- 应用简单冒泡排序。思想:降序,则选出较小的,“push” backwards。