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直接对应table[x%m],但table[x%m]不能直接打印,需要头插到结果字符串result,即result=table[x%m]+result;

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

方法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 进制数。对于超过十进制的数码,用 AB,...... 表示。

输入格式

第一行一个整数 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;
} 

提交结果

相关推荐
enyp8010 分钟前
Qt QStackedWidget 总结
开发语言·qt
gu2022 分钟前
c#编程:学习Linq,重几个简单示例开始
开发语言·学习·c#·linq
lly20240622 分钟前
SQLite 删除表
开发语言
wjs202428 分钟前
HTML 字符实体
开发语言
二十雨辰37 分钟前
[Java基础]网络编程
java·开发语言
MZWeiei40 分钟前
PTA:运用顺序表实现多项式相加
算法
GISer_Jing1 小时前
Javascript排序算法(冒泡排序、快速排序、选择排序、堆排序、插入排序、希尔排序)详解
javascript·算法·排序算法
cookies_s_s1 小时前
Linux--进程(进程虚拟地址空间、页表、进程控制、实现简易shell)
linux·运维·服务器·数据结构·c++·算法·哈希算法
AC使者1 小时前
介绍 TensorFlow 的基本概念和使用场景。
开发语言·自然语言处理·sqlite·github
不想编程小谭1 小时前
力扣LeetCode: 2506 统计相似字符串对的数目
c++·算法·leetcode