【洛谷 P1143】进制转换 题解(数学+除基取余法)

进制转换

题目描述

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

输入格式

共三行,第一行是一个正整数,表示需要转换的数的进制 n   ( 2 ≤ n ≤ 16 ) n\ (2\le n\le 16) n (2n16),第二行是一个 n n n 进制数,若 n > 10 n>10 n>10 则用大写字母 A ∼ F \verb!A!\sim \verb!F! AF 表示数码 10 ∼ 15 10\sim 15 1015,并且该 n n n 进制数对应的十进制的值不超过 1 0 9 10^9 109,第三行也是一个正整数,表示转换之后的数的进制 m   ( 2 ≤ m ≤ 16 ) m\ (2\le m\le 16) m (2m16)

输出格式

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

样例 #1

样例输入 #1

16
FF
2

样例输出 #1

11111111

思路

输入一个整数,一个字符串,和另一个整数。第一个整数(n)代表源数的基数,字符串(src)代表源数(以字符串形式给出),第二个整数(m)代表目标基数。

然后,它从源数的最低有效位开始(即字符串的最右端),并逐个处理每一位。对于每一位,它首先检查这个字符是否大于’9’,也就是说,它是否是一个字母。如果是,那么它将该字符转换为对应的数字(A为10,B为11等等)。否则,它将该字符(一个数字字符)转换为对应的整数。然后,它将这个数乘以源基数的适当次方(对于最低有效位是0,次低有效位是1,依此类推),并将结果累加到一个总和中。这个总和(num1)最终将是源数转换为十进制的结果。

接下来,将这个十进制数转换为目标基数。通过不断地除以目标基数并取余数来做到这一点。每次取余数,它都会得到转换后的数的一位。如果这个余数大于9,那么它将这个余数转换为对应的字母;否则,它将这个余数转换为对应的数字字符。然后,它将这个字符添加到结果字符串的前面。这个过程一直持续到十进制数变为0。

最后,程序输出转换后的数(即目标基数的字符串表示)。这样就完成了从一个基数到另一个基数的转换。


AC代码

#include 
#include 
#define AUTHOR "HEX9CF"
using namespace std;

int n, m;
long long num1;
string src, dst;

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);

	cin >> n >> src >> m;

	auto it1 = src.rbegin();
	for (int i = 0; it1 != src.rend(); it1++, i++) {
		int j = 0;
		if (*it1 > '9') {
			j = *it1 + 10 - 'A';
		} else {
			j = *it1 - '0';
		}
		num1 += j * pow(n, i);
	}
	// cout << num1 << endl;

	dst = "";
	for (int i = num1; num1 > 0; num1 /= m) {
		int j = num1 % m;
		// cout << j << endl;
		if (j > 9) {
			dst = (char)(j - 10 + 'A') + dst;
		} else {
			dst = (char)(j + '0') + dst;
		}
	}
	cout << dst << endl;

	return 0;
}

你可能感兴趣的:(Algorithm,Problems,算法,c++)