简单进制转换

题目描述:

进位制在生活中的运用非常频繁,比方说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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值