CE10.【C++ Cont】练习题组11(进制转换专题)

目录

1.B2143进制转换

题目

分析

代码

方法1

提交结果

方法2

提交结果

★方法3(推荐)

递归调用展开图

提交结果

相似题

[2.B3620 x 进制转 10 进制](#2.B3620 x 进制转 10 进制)

题目

分析

代码

方法1

提交结果

方法2

提交结果

[3. P1143 进制转换](#3. P1143 进制转换)

题目

代码

提交结果


1.B2143进制转换

题目

https://www.luogu.com.cn/problem/B2143

题目描述

用递归算法将一个十进制整数 X(1≤X≤10^9)转换成任意进制数 M(2≤M≤16,M 为整数)。

输入格式

一行两个数,第一个十进制整数 X,第二个为进制 M。

输出格式

输出结果。

输入输出样例

输入 #1

复制代码
31 16 

输出 #1

复制代码
1F

说明/提示

样例解释。

将十进制 31 转化为十六进制数。

分析

用递归做,注意到是转换成**"任意进制"** ,因此需要存表string table="0123456789ABCDEF";(注意table要定义成全局变量才有用!!),

方法1:每次除M得出的余数x%m直接对应tablex%m,但tablex%m不能直接打印,需要头插到结果字符串result,即result=tablex%m+result;

递归返回的条件:x<m(被转换的数字小于m不用转换了),直接头插tablex后返回

方法2:先尾插,之后使用reverse函数

代码

方法1

cpp 复制代码
#include <iostream> 
using namespace std;
string table="0123456789ABCDEF";
string result;
void f(int x,int m)
{
	if (x<m)
	{
		result=table[x]+result;
		return;
	}
	result=table[x%m]+result;
	return f(x/m,m);
}


int main()
{
	int x,m;
	cin>>x>>m;
	f(x,m);
	cout<<result;
	return 0;
} 
提交结果

方法2

cpp 复制代码
#include <iostream>
#include <algorithm> 
using namespace std;
string table="0123456789ABCDEF";
string result;
void f(int x,int m)
{
	if (x<m)
	{
		result.push_back(table[x]);
		return;
	}
	result.push_back(table[x%m]);
	return f(x/m,m);
}


int main()
{
	int x,m;
	cin>>x>>m;
	f(x,m);
	reverse(result.begin(),result.end());
	cout<<result;
	return 0;
} 
提交结果

★方法3(推荐)

不用创建result字符串,先递归再打印,让x<m的x最先打印

递归调用展开图
cpp 复制代码
#include <iostream>
using namespace std;
string table="0123456789ABCDEF";
void f(int x,int m)
{
	if (x>=m)
	{
		f(x/m,m); 
	}
	cout<<table[x%m];
}

int main()
{
	int x,m;
	cin>>x>>m;
	f(x,m);
	return 0;
} 
提交结果

相似题

10进制转x进制 https://www.luogu.com.cn/problem/B3619#submit

只要把string table="0123456789ABCDEF";改成string table="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";即可

2.B3620 x 进制转 10 进制

题目

https://www.luogu.com.cn/problem/B3620

题目描述

给一个小整数 x 和一个 x 进制的数 S。将 S 转为 10 进制数。对于超过十进制的数码,用 A,B,...... 表示。

输入格式

第一行一个整数 x;

第二行一个字符串 S。

输出格式

输出仅包含一个整数,表示答案。

输入输出样例

输入 #1

复制代码
16
7B

输出 #1

复制代码
123

说明/提示

【数据规模和约定】

保证目标数在十进制下不超过 10^9,1≤x≤36。

分析

方法1:遍历一遍字符串,每一位数字乘以对应的权重即可

方法2:库函数stoi(具体参见C16.【C++ Cont】string类字符串的关系运算和与string有关的函数文章)

代码

方法1

cpp 复制代码
#include <iostream>
#include <cmath> 
using namespace std;
int main()
{
	string s;
	int x,num=0;
	cin>>x>>s;
	for (int i=s.size()-1;i>=0;i--)
	{
		if (s[i]<='9')
		num+=(s[i]-'0')*pow(x,s.size()-1-i);
		else
		num+=(s[i]-'A'+10)*pow(x,s.size()-1-i);
	}
	cout<<num;
	return 0;
} 
提交结果

方法2

cpp 复制代码
#include <iostream>
#include <string> 
using namespace std;
int main()
{
	string s;
	int x,num=0;
	cin>>x>>s;
	cout<<stoi(s,NULL,x);
	return 0;
} 
提交结果

3. P1143 进制转换

题目

https://www.luogu.com.cn/problem/P1143

题目描述

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

输入格式

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

输出格式

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

输入输出样例

输入 #1

复制代码
16
FF
2

输出 #1

复制代码
11111111

代码

有了前两道题的基础,这道题顺风顺水,直接复制粘贴前面的代码

cpp 复制代码
#include <iostream>
#include <string> 
using namespace std;
string table="0123456789ABCDEF";
void f(int x,int m)
{
	if (x>=m)
	{
		f(x/m,m); 
	}
	cout<<table[x%m];
}

int main()
{
	string s;
	int from_x,to_x,num=0;
	cin>>from_x>>s;
	int tmp=stoi(s,NULL,from_x);
	cin>>to_x;
	f(tmp,to_x);
	return 0;
} 

提交结果

相关推荐
一水鉴天2 小时前
映射、哈希表与哈斯图:计算机科学的三种基线 20261003(元宝)
开发语言·人工智能
Frank_refuel2 小时前
C++11之一场名为“搬家”的 C++ 之旅
开发语言·c++
Wang's Blog3 小时前
Java 项目实战: 外卖平台优化-Nginx配置文件结构与块层级
java·开发语言·nginx
2601_962071573 小时前
类变量和全局变量的查找路径有什么区别?
开发语言·python
hetao17338374 小时前
2026-10-03~04 hetao1733837 的刷题记录
c++·算法
\光辉岁月/4 小时前
5.java-数组
java·开发语言
Java后端的Ai之路4 小时前
Python进阶探索29_eval内置函数
开发语言·python·探索·eval·内置函数
谢亮_vipxieliang5 小时前
Spring 事务失效的常见场景
java·开发语言·数据库·spring boot
Zootopia6265 小时前
飞行力学知识梳理1|飞行性能与稳定性
人工智能·python·算法·机器学习·无人机·学习方法·信息与通信
longlongzihan5 小时前
从LeetCode 70. 爬楼梯看动态规划:如何精准推导状态转移方程?
c++·算法·leetcode·动态规划