[洛谷] P1143 进制转换

1.题目

题目描述

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

输入格式

共三行,第一行是一个正整数,表示需要转换的数的进制[洛谷] P1143 进制转换_进制,第二行是一个n进制数,若[洛谷] P1143 进制转换_开发语言_02则用大写字母[洛谷] P1143 进制转换_开发语言_03表示数码[洛谷] P1143 进制转换_开发语言_04,并且该[洛谷] P1143 进制转换_进制转换_05进制数对应的十进制的值不超过[洛谷] P1143 进制转换_开发语言_06,第三行也是一个正整数,表示转换之后的数的进制[洛谷] P1143 进制转换_进制_07

输出格式

一个正整数,表示转换之后的[洛谷] P1143 进制转换_c++_08进制数。

样例输入 #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;
}

[洛谷] P1143 进制转换_c++_09

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;
}

[洛谷] P1143 进制转换_c++_10

4.总结

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