[洛谷] P1143 进制转换

1.题目

题目描述

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

输入格式

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

输出格式

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

样例输入 #1

16
FF
2

样例输出 #1

11111111

2.分析

进制转换~

3.代码

1. map映射 + 手写进制转换 AC

#include <iostream>
using namespace std;
#include <sstream>
const int N = 1e2;
int p1, p2;
int jz[N];
char zj[N];
void init()
{
	// char == > n
	for (int i = '0', j = 0; i <= '9'; ++i, ++j)
		jz[i] = j;
	for (int i = 'A', j = 10; i <= 'F'; ++i, ++j)
		jz[i] = j;

	//n == > char
	for (int i = 0, j = '0'; i <= 9; ++i, ++j)
		zj[i] = j;
	for (int i = 10, j = 'A'; i <= 15; ++i, ++j)
		zj[i] = j;

}

//p1 -> 10
int cg_to_10(string s)
{
	int res = 0;
	for (int i = 0; i <s.size(); ++i)
		res = res * p1 + jz[s[i]];
	return res;
}


//10 -> p2
string cg_to_p2(int n)
{
	string res;
	while (n)
	{
		res.push_back(zj[n % p2]);
		n /= p2;
	}
	return string(res.rbegin(), res.rend());
}

int main()
{
	init();
	string s;
	scanf("%d", &p1);
	cin >> s;

	int t = cg_to_10(s);

	scanf("%d", &p2);

	s = cg_to_p2(t);

	cout << s;
	return 0;
}

在这里插入图片描述

2.巧妙使用快读 + 进制转换

#include <iostream>
using namespace std;
int p1, p2;
int x;
//补充:按位取反规则
//1.所有正整数的按位取反是其本身 + 1的负数
//2.所有负整数的按位取反是其本身其绝对值 - 1   eg: ~(-1) == 0
//3.零的按位取反是 - 1(0在数学界既不是正数也不是负数)
int hf(char c)
{
	if (c >= 'A' && c <= 'F')
		return c + 10 - 'A';
	else if (c >= '0' && c <= '9')
		return c - '0';
	//其它符号则返回-1
	return -1;  // ~(-1) ==0
}

//读入时,顺便转换为10进制
inline int read()
{
	char c=getchar();
	int x = 0;
	while (hf(c) == -1) c = getchar();
	while (~hf(c))
	{
		x = x * p1 + hf(c);
		c = getchar();
	}
	return x;
}

char itc(int t)
{
	if (t >= 10 && t <= 15) return 'A' + t - 10;
	else //t>=0  t<=9
		return '0' + t;
}
inline void write(int x)
{
	if (x >= p2) write(x / p2);
	putchar(itc(x % p2));
}

int main()
{
	scanf("%d", &p1);
	x = read();
	scanf("%d", &p2);
	write(x);
	return 0;
}

在这里插入图片描述

4.总结

补充:按位取反规则
1.所有正整数的按位取反是其本身 + 1的负数
2.所有负整数的按位取反是其本身其绝对值 - 1 eg: ~(-1) == 0
3.零的按位取反是 - 1(0在数学界既不是正数也不是负数)

5.更新日志

2022.8.26 整理

欢迎交流、讨论、指正~
不正确、不理解之处欢迎评论留言~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值