• [洛谷] 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
    • 2
    • 3

    样例输出 #1

    11111111
    
    • 1

    2.分析

    进制转换~

    3.代码

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

    #include 
    using namespace std;
    #include 
    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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61

    在这里插入图片描述

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

    #include 
    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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52

    在这里插入图片描述

    4.总结

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

    5.更新日志

    2022.8.26 整理

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

  • 相关阅读:
    LeetCode 0630.课程表 III:贪心 + 优先队列
    价格监测的目标
    基础篇——配置文件解析
    潘多尼亚精灵 VoxEdit 创作大赛
    circt firtool man page
    现有n1+n2种面值的硬币,其中前n1种为普通币,可以取任意枚,后n2种为纪念币,每种最多只能取一枚,每种硬币有一个面值,问能用多少种方法拼出m的面值?
    LeetCode 309 周赛
    高斯模糊滤镜
    反转链表算法
    Docker理论—虚拟化技术的优点和缺点
  • 原文地址:https://blog.csdn.net/qq_60404548/article/details/126550872