洛谷P1143 进制转换

进制转换

洛谷题目链接:https://www.luogu.com.cn/problem/P1143#submit

题目描述

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

输入格式

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

输出格式

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

样例 #1

样例输入 #1

16
FF
2

样例输出 #1

11111111

思路:

  1. 这题我们可以先将输入的进制的数字先转化为我们熟悉的10进制数字,再通过对十进制数字转化成我们需要的m进制。
  2. 如何将n进制的数字转化为10进制呢?我们都知道2进制如何转化为10进制,就是从2进制的最后一位开始,当前数字*20+当前数字*21+....一直这样下去,直到到达2进制数字的第一位结束。那么我们也可以对n进制的数字这样操作,只需要将2改为n即可,这个步骤的代码如下:
// r进制的数转化为10进制
int to_10(string s, int r) {
	int result = 0;
	int flag = 0;
	for (int i = s.size() - 1; i >= 0; i--) {
		int current;
		if (s[i] >= '0' && s[i] <= '9') {
			current = s[i] - '0';
		}
		else { //如果这个位置不是数字表示的,就把它转化为数字表示
			current = s[i] - 'A' + 10;
		}
		result += current * pow(r, flag++);
	}
	return result;
}
  1. 然后,我们将我们熟悉的二进制的数字转化为m进制即可,如何转化为m进制呢?同样我们还是以二进制举例,我们知道,对十进制的数字一直对2取余的结果,最后再倒序输出,最后的结果就是二进制了,同样的我们将2改为m,就可以将十进制的数字改为m进制,这个阶段的代码如下:
//十进制数转化成R进制
string to_R(int n, int r)
{
	string result;
	if (n == 0) return result;
	while (n) {
	    //求余数
		int remainder = n % r;
		if (remainder < 10) result = char(remainder + '0') + result;
		else result = char(remainder - 10 + 'A') + result;
		//更新n的值
		n /= r;
	}
	return result;
}

最后,整个程序的C++代码如下:

#include<iostream>
using namespace std;
#include<cmath>
// r进制的数转化为10进制
int to_10(string s, int r) {
	int result = 0;
	int flag = 0;
	for (int i = s.size() - 1; i >= 0; i--) {
		int current;
		if (s[i] >= '0' && s[i] <= '9') {
			current = s[i] - '0';
		}
		else { //如果这个位置不是数字表示的,就把它转化为数字表示
			current = s[i] - 'A' + 10;
		}
		result += current * pow(r, flag++);
	}
	return result;
}

//十进制数转化成R进制
string to_R(int n, int r)
{
	string result;
	if (n == 0) return result;
	while (n) {
	    //求余数
		int remainder = n % r;
		if (remainder < 10) result = char(remainder + '0') + result;
		else result = char(remainder - 10 + 'A') + result;
		//更新n的值
		n /= r;
	}
	return result;
}
int main()
{
	int n, m;
	string s;
	cin >> n >> s >> m;
	int result = to_10(s, n);
	string res=to_R(result, m);
	cout << res << endl;
	return 0;
}
posted @ 2024-07-23 11:46  Tomorrowland_D  阅读(4)  评论(0编辑  收藏  举报