首页 > 其他分享 >p1143 进制转换

p1143 进制转换

时间:2022-11-27 11:00:38浏览次数:50  
标签:10 cnt 转换 进制 16 int p1143 include

进制转换

题目描述

请你编一程序实现两种不同进制之间的数据转换。

输入格式

共三行,第一行是一个正整数,表示需要转换的数的进制\(n(2≤n≤16)\),第二行是一个n进制数,若\(n>10\)则用大写字母\(A-F\)表示数码\(10-15\),并且该\(n\)进制数对应的十进制的值不超过\(1000000000\),第三行也是一个正整数,表示转换之后的数的进制\(m(2≤m≤16)\)。

输出格式

一个正整数,表示转换之后的\(m\)进制数。

样例 #1

样例输入 #1

16
FF
2

样例输出 #1

11111111

思路

由于考虑的是n进制转m进制,最正常的想法是将n进制转10进制,再从10进制转m进制。

先考虑n转10:

for(int i=s.length()-1;i>=0;i--){
		if(s[i]>='0'&&s[i]<='9'){
			cnt+=(s[i]-'0')*pow(n,s.length()-i-1);
		}else{
			cnt+=(s[i]-'A'+10)*pow(n,s.length()-i-1); 
		}
	}

其中考虑到10进制往上以字母表示,因此else中的s[i]-'A'+10表示的是10-16的数(题目n的范围不大),此时得到的cnt为10进制下表示的数。

    int t;
	int d=0;
	while(cnt!=0){
		t=cnt%m;
		a[d++]=t;
		cnt/=m;
	}

此时就是将10进制往m进制转了,那么d表示的是这一位的数,以便后面可以用具体的数字进行表示。

完整代码

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<map>
#include<vector>
#include<queue>
#include<set>
#include<unordered_map>
using namespace std;
char show[16]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
char a[10001];

int main(){
	int n,m;
	string s;
	cin>>n>>s>>m;
	int cnt=0;
	for(int i=s.length()-1;i>=0;i--){
		if(s[i]>='0'&&s[i]<='9'){
			cnt+=(s[i]-'0')*pow(n,s.length()-i-1);
		}else{
			cnt+=(s[i]-'A'+10)*pow(n,s.length()-i-1); 
		}
	}
	int t;
	int len=0;
	while(cnt!=0){
		t=cnt%m;
		a[len++]=t;
		cnt/=m;
	}	
	for(int i=len-1;i>=0;i--){
		cout<<show[a[i]];
	}
	return 0;
}

标签:10,cnt,转换,进制,16,int,p1143,include
From: https://www.cnblogs.com/simdow/p/16929139.html

相关文章