[洛谷] P1143 进制转换
1.题目
题目描述
请你编一程序实现两种不同进制之间的数据转换。
输入格式
共三行,第一行是一个正整数,表示需要转换的数的进制 n ( 2 ≤ n ≤ 16 ) n(2≤n≤16) n(2≤n≤16),第二行是一个n进制数,若 n > 10 n>10 n>10则用大写字母 A − F A-F A−F表示数码 10 − 15 10-15 10−15,并且该 n n n进制数对应的十进制的值不超过 1000000000 1000000000 1000000000,第三行也是一个正整数,表示转换之后的数的进制 m ( 2 ≤ m ≤ 16 ) m(2≤m≤16) m(2≤m≤16)。
输出格式
一个正整数,表示转换之后的 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 整理
欢迎交流、讨论、指正~
不正确、不理解之处欢迎评论留言~