题目描述:
进位制在生活中的运用非常频繁,比方说7进制,10进制,还有60进制等,下面请聪明的你对于简单的2-16进制的数字进行运算。
我们将给出每一组的数据和对应的进制,请你将数据转化为十进制,并按照先进制(由大到小)后大小(由大到小)的顺序排列出来。
注:在11~16进制中,a~f分别表示10~15。
输入格式:
第1行输入数据的组数n
第2~n+1行,每一行输入一个字符串一个整数。代表数字及其进制。
输出格式:
第1~n行,每一行输出两个整数。前一个代表数值的十进制,后一个代表它原有的进制。
样例输入:
7
14 7
1ab 14
100101 2
fff 16
278 7
1001 2
abd 16
样例输出:
4095 16
2749 16
347 14
155 7
11 7
37 2
9 2
数据范围:
1≤n≤100
# include<stdio.h>
# include<string.h>
# include<math.h>
/*对于简单的2-16进制的数字进行运算。
我们将给出每一组的数据和对应的进制,
请你将数据转化为十进制,并按照先进制(由大到小)后大小(由大到小)的顺序排列出来。
注:在11~16进制中,a~f分别表示10~15。
输入格式:
第1行输入数据的组数n
第2~n+1行,每一行输入一个字符串一个整数。代表数字及其进制。
输出格式:
第1~n行,每一行输出两个整数。前一个代表数值的十进制,后一个代表它原有的进制。
样例输入:
7
14 7
1ab 14
100101 2
fff 16
278 7
1001 2
abd 16
样例输出:
4095 16
2749 16
347 14
155 7
11 7
37 2
9 2
据范围:
1≤n≤100
1≤字符串长度≤8*/
int swap(char* a, char*b, long long*c, long long*d)
{
char temp;
long long temp2;
for(int i = 0;i < 8;i ++)
{
temp = *(a + i);
*(a + i) = *(b + i);
*(b + i) = temp;
}
temp2 = *c;
*c = *d;
*d = temp2;
return 0;
}
int swap1(long long* a, long long *b, long long*c, long long*d)
{
long long temp2;
temp2 = *a;
*a = *b;
*b = temp2;
temp2 = *c;
*c = *d;
*d = temp2;
return 0;
}
int main()//a存输入。b存输出,都把进制存在最后
{
int n,len,temp,k;
scanf("%d", &n);//读入行数
char a[n][9];//字符数组大小必须比字符串大小大,这样最后才有截断,否则会继续向后读取
long long b[n][2];//因为数比较大,用long long
for(int i = 0;i < n;i ++)//别忘了 可变数组无法初始化
{
for (int j = 0;j < 9;j ++)
{ //还有注意是反斜杠
a[i][j] = '\0';//注意,对字符串数组初始化一定要用\0表示结束,别用0——
} //这样就能防止无意中打了单引号变成数字‘0’
}
for(int i = 0;i < n;i ++)//别忘了 可变数组无法初始化
{
for (int j = 0;j < 2;j ++)
{
b[i][j] = 0;
}
}
for(int i = 0; i < n; i ++)
{
scanf("%s", a[i]);//scanf读取字符串会跳过空格
scanf("%lld", &b[i][1]);
}
for(int i =0; i < n-1; i ++)
{
k = i;//选择排序
for(int j = i + 1; j < n ; j ++)
{
if(b[k][1] < b[j][1])
{
k = j;
}
}
swap(a[i], a[k], &b[i][1], &b[k][1]);
}
for(int i = 0;i < n; i ++)//运算
{
len=strlen(a[i]);
for(int j = 0;j < len;j ++)
{
if(a[i][j] > 96)
{
b[i][0] +=(a[i][j]-87) * (long long)pow(b[i][1],len-j-1);
}
else if(a[i][j] > 47 && a[i][j] < 58)
{
b[i][0] += (a[i][j]-48)* (long long)pow(b[i][1],len-j-1);
}
}
}
int i;//根据样例,同进制时按大小排,所以再排一次
for(i = 0;i < n; i++)//用i遍历
{
len = 1;//初始数组长度为1,因为至少长1
int q;
while(b[i][1] == b[i + 1][1])//判断同进制长度
{
len ++;
i ++;//i记录相同进制的末尾下标
}//选择排序和判断放在同一循环,使得i可以在选择排序时用作上界
for(int j = i - len + 1 ; j < i && i - len >=0 ; j ++)
//注意还要保证i-len>0;因为一开始len=1,而i=0,则j就=-1了
//这样就会在一开始进入循环 ,同时q从0开始,那么b[-1]与b[0]比较
//有可能交换,得到奇怪的值
{//*用len,i相减以确定同进制的开头下标,但由于会减去自己,所以+1
k = j;//选择排序
for( q = j + 1;q <= i;q ++)//注意这里是<=,因为i本身就是下标;如果是n(上文的)
{ //则n不是数组下标,而是数组长度,故<
if(b[k][0] < b[q][0])
{
k = q;
}
}
swap1(&b[j][0], &b[k][0], &b[j][1], &b[k][1]);
}
}
for(int i = 0;i < n;i ++)
{
printf("%lld %lld\n", b[i][0], b[i][1]);
}
return 0;
}