2021-04-14

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。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值