蓝桥杯备赛——进制转化相关问题
目录
一、基础概念
二、问题研究(1)
代码解读:
1. transfer 函数
代码功能概述
详细步骤
2. main 函数
代码功能概述
详细步骤
三、运用递归解决
(一)
代码如下:
代码解读:
(二)
代码如下:
代码2:(使用库函数)
(三)
示例
一、基础概念
常见的进制包括:
二进制(Base 2):0b1010(C++14支持前缀)
八进制(Base 8):以 0 开头的数字,如 012
十进制(Base 10):默认表示方式,如 42
十六进制(Base 16):以 0x 开头,如 0x2A
二、问题研究(1)
设计一个函数,将十进制数转换成二进制、八进制和十六进制。然后在主函数中读入一个整数,调用函数,输出转换结果。
思路:
• 假设将十进制数 57 转换为二进制
• 从右到左写出每列的位值,直到发现位值大于该十进制数的列。这样就先得到
位值:64 32 16 8 4 2 1
• 然后去掉位值为 64 的列,得到:
位值:32 16 8 4 2 1
• 然后,从左至右进行。 57 除以 32 得商为 1 ,余数为 25 ,所以在 32 这列写下 1 ,然后 25 除以 16 商为 1 ,余数为 9 ,所以在 16 这列写下 1 , ……
位值: 32 16 8 4 2 1
符号值: 1 1 1 0 0 1 所以(57)10=(111001)2
• 假设将十进制数 57 转换为八进制
• 从右到左写出每列的位值,直到发现位值大于该十进制数的列。这样就先得到
位值:64 8 1
• 然后去掉位值为 64 的列,得到:
位值:8 1
• 然后,从左至右进行。 57 除以 8 得商为 7 ,余数为 1 ,所以在 8 这列写下 1 ,然后 1 除以 1 商为 1 ,余数为 0 ,所以在 1 这列写下 1.
位值: 8 1
符号值: 7 1 所以(57)10=(71)8
代码(1)(常规不使用递归):
void transfer(int num, int base)
{int p, k;p = 1;while (p <= num) //求p:p是base的x次幂,且p大于num p = p * base;p = p / base;/*循环求base进制数的各位*/while (p != 0) {k = num / p; /*计算当前要输出的那个base进制数*/if (k <= 9)printf("%d", k);elseprintf("%c", k-10+'A');num = num % p;p = p / base;}
}
int main()
{int num = 0;int base = 0;printf("先输入要转化的数:");scanf("%d", &num);printf("输入转化进制:");scanf("%d", &base);transfer(num, base);return 0;
}
代码解读:
1. transfer 函数
void transfer(int num, int base)
{int p, k;p = 1;while (p <= num) //求p:p是base的x次幂,且p大于num p = p * base;p = p / base;/*循环求base进制数的各位*/while (p != 0) {k = num / p; /*计算当前要输出的那个base进制数*/if (k <= 9)printf("%d", k);elseprintf("%c", k-10+'A');num = num % p;p = p / base;}
}
代码功能概述
该函数接受两个参数:num 表示要转换的十进制数,base 表示目标进制。函数的主要作用是将十进制数 num 转换为 base 进制数并输出。
详细步骤
-
初始化变量:
p用于存储base的幂次,初始化为 1。k用于存储当前位的数字。
-
计算
p的值:- 使用
while循环不断将p乘以base,直到p大于num。此时p是base的某个幂次,且这个幂次是使得p大于num的最小幂次。 - 然后将
p除以base,得到最大的小于等于num的base的幂次。
- 使用
-
循环求
base进制数的各位:- 进入
while循环,只要p不为 0,就继续循环。 - 计算当前位的数字
k,通过num / p得到。 - 如果
k小于等于 9,则直接输出该数字。 - 如果
k大于 9,则输出对应的字母(A - Z),通过k - 10 + 'A'实现。 - 更新
num为num % p,去掉已经处理过的高位。 - 更新
p为p / base,处理下一位。
- 进入
2. main 函数
int main()
{int num = 0;int base = 0;printf("先输入要转化的数:");scanf("%d", &num);printf("输入转化进制:");scanf("%d", &base);transfer(num, base);return 0;
}
代码功能概述
main 函数是程序的入口,负责从用户那里获取要转换的十进制数和目标进制,然后调用 transfer 函数进行转换。
详细步骤
-
初始化变量:
num用于存储用户输入的要转换的十进制数,初始化为 0。base用于存储用户输入的目标进制,初始化为 0。
-
获取用户输入:
- 使用
printf函数提示用户输入要转换的数,然后使用scanf函数读取用户输入并存储到num中。 - 使用
printf函数提示用户输入目标进制,然后使用scanf函数读取用户输入并存储到base中。
- 使用
-
调用
transfer函数:- 调用
transfer函数,将num和base作为参数传递给该函数进行转换。
- 调用
-
返回值:
- 程序正常结束,返回 0。
三、运用递归解决
(一)
题目描述
给定一个十进制整数 𝑛和一个小整数 𝑥。将整数 𝑛 转为 𝑥进制。对于超过十进制的数码,用 A,B ...表示。
输入格式
第一行一个整数
𝑛
第二行一个整数
𝑥
输出格式
输出仅包含一个整数,表示答案。
输入输出样例
输入
1000
2
输出
1111101000
代码如下:
#include <iostream>
using namespace std;
string s = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
void print(int n, int x)
{if (n >= x)print(n / x, x);cout << s[n % x];
}
int main()
{int n = 0;int x = 0;cin >> n >> x;print(n, x);return 0;
}
代码解读:
全局变量部分
- 定义了一个全局字符串变量
s,它包含了从0到9以及从A到Z的字符。这个字符串用于在进制转换时表示不同进制下的每一位数字。在转换过程中,通过索引来从这个字符串中取出对应的字符进行输出,从而方便处理大于9的数字(如十六进制中的A-F)。
print 函数部分、
void print(int n, int x)
{if (n >= x)print(n / x, x);cout << s[n % x];
}
函数功能概述
print 函数是一个递归函数,其作用是将十进制整数 n 转换为 x 进制数并输出。
详细步骤
-
递归条件判断:
if (n >= x):如果当前的十进制数n大于或等于目标进制x,说明n还可以继续分解为更高位的x进制数。print(n / x, x):递归调用print函数,将n除以x的商作为新的n继续进行转换。这样做的目的是先处理高位的x进制数,因为递归会不断深入,直到处理到最高位。
-
输出当前位数字:
cout << s[n % x];:当n小于x时,递归调用结束,开始回溯输出。n % x得到n除以x的余数,这个余数就是当前位的x进制数字。通过s[n % x]从字符串s中取出对应的字符并输出。
main 函数部分
int main()
{int n = 0;int x = 0;cin >> n >> x;print(n, x);return 0;
}
函数功能概述
main 函数是程序的入口,负责从用户那里获取要转换的十进制数和目标进制,然后调用 print 函数进行转换和输出。
详细步骤
-
变量初始化:
int n = 0;:定义并初始化一个整型变量n,用于存储用户输入的要转换的十进制数。int x = 0;:定义并初始化一个整型变量x,用于存储用户输入的目标进制。
-
获取用户输入:
cin >> n >> x;:使用标准输入流cin从用户那里读取两个整数,分别存储到n和x中。
-
调用
print函数:print(n, x);:调用print函数,将n转换为x进制数并输出。
-
返回值:
return 0;:程序正常结束,返回0表示程序成功执行。
(二)
题目描述
给一个小整数 x 和一个 x 进制的数 𝑆将 𝑆转为 10进制数。对于超过十进制的数码,用 A,B,
…表示。
输入格式
第一行一个整数
𝑥
第二行一个字符串
𝑆
输出格式
输出仅包含一个整数,表示答案。
代码如下:
#include <iostream>
#include <cmath>
using namespace std;
int main()
{int x = 0;string s;cin >> x;cin >> s;int ret = 0;int n = s.size();int i = 0;while (--n >= 0){if (s[n] <= '9')ret += (s[n] - '0') * pow(x, i);elseret += (s[n] + 10 - 'A') * pow(x, i);i++;}cout << ret << endl;return 0;
}
代码解读:
int x = 0;:声明并初始化一个整型变量x,用于存储输入的进制数,初始值为 0。string s;:声明一个字符串变量s,用于存储x进制的数字字符串。cin >> x;:从标准输入读取一个整数,赋值给x,表示要转换的数字的进制。cin >> s;:从标准输入读取一个字符串,赋值给s,表示x进制的数字。int ret = 0;:声明并初始化一个整型变量ret,用于存储最终转换后的十进制结果,初始值为 0。int n = s.size();:获取字符串s的长度,存储在变量n中,后续用于遍历字符串。int i = 0;:声明并初始化一个整型变量i,用于记录当前处理的字符对应的幂次,初始值为 0。
while (--n >= 0)
{if (s[n] <= '9')ret += (s[n] - '0') * pow(x, i);elseret += (s[n] + 10 - 'A') * pow(x, i);i++;
}
while (--n >= 0):这是一个while循环,--n先将n的值减 1,然后判断是否大于等于 0。通过这种方式从字符串s的最后一个字符开始向前遍历。if (s[n] <= '9'):判断当前字符是否为数字字符(即0-9)。- 如果是数字字符,
s[n] - '0'可以将字符转换为对应的整数值,例如字符'5'减去字符'0'得到整数 5。然后乘以pow(x, i),pow(x, i)是x的i次幂,表示该位对应的权重,最后将结果累加到ret中。
- 如果是数字字符,
else:如果当前字符不是数字字符,说明是字母字符(如A-Z),代表大于 9 的数字。s[n] + 10 - 'A'可以将字母字符转换为对应的整数值,例如字符'A'转换为 10,'B'转换为 11 等。同样乘以pow(x, i)并累加到ret中。i++;:每处理完一位,幂次i加 1,用于处理下一位的权重。
代码2:(使用库函数)
#include <iostream>
#include <cmath>
using namespace std;
int main()
{int x = 0;string s;cin >> x;cin >> s;int ret = 0;ret = stoi(s, NULL, x);cout << ret << endl;return 0;
}
关于stoi的讲解,请看博客C++ string超详解!!(小白也能看懂)-CSDN博客
(三)
把数x转化成m进制。
思路:不难发现,其实就是上面两个题的结合体。
代码如下:
#include <iostream>
using namespace std;
string str = "0123456789ABCDEF";
void print(int num, int m)
{if (num >= m)print(num / m, m);cout << str[num % m];
}
int main()
{int n = 0;string s;int m = 0;cin >> n;cin >> s;cin >> m;int num = stoi(s, NULL, n);print(num, m);return 0;
}
- 变量声明与输入获取:
int n = 0;:用于存储输入的源进制,初始化为 0。string s;:用于存储n进制的字符串。int m = 0;:用于存储目标进制,初始化为 0。cin >> n;、cin >> s;、cin >> m;:依次从标准输入读取源进制n、n进制的字符串s和目标进制m。
- 进制转换:
int num = stoi(s, NULL, n);:使用stoi函数将字符串s从n进制转换为十进制数,结果存储在num中。stoi函数的第一个参数是要转换的字符串,第二个参数NULL表示不使用字符串结束位置的指针,第三个参数n表示源进制。
- 输出结果:
print(num, m);:调用print函数,将十进制数num转换为m进制数并输出。
- 返回值:
return 0;:程序正常结束,返回 0 表示程序执行成功。
示例
假设输入 n = 16,s = "FF",m = 10。
stoi(s, NULL, n)会将十六进制字符串"FF"转换为十进制数 255,存储在num中。- 调用
print(num, m),即print(255, 10)。- 递归调用
print(255 / 10, 10)即print(25, 10),继续递归调用print(25 / 10, 10)即print(2, 10)。 - 因为
2 < 10,输出str[2 % 10]即2。 - 回溯到
print(25, 10),输出str[25 % 10]即5。 - 回溯到
print(255, 10),输出str[255 % 10]即5。 - 最终输出结果为
255
- 递归调用
相关文章:
蓝桥杯备赛——进制转化相关问题
目录 一、基础概念 二、问题研究(1) 代码解读: 1. transfer 函数 代码功能概述 详细步骤 2. main 函数 代码功能概述 详细步骤 三、运用递归解决 (一) 代码如下: 代码解读: &#…...
DevOps的个人学习
一、DevOps介绍 软件开发最初是由两个团队组成: 开发团队:负责设计和构建系统。运维团队:负责测试代码后部署上线,确保系统稳定安全运行。 这两个看似目标不同的团队需要协同完成一个软件的开发。DevOps整合了开发与运维团队&a…...
使用Pytorch训练一个图像分类器
一、准备数据集 一般来说,当你不得不与图像、文本或者视频资料打交道时,会选择使用python的标准库将原始数据加载转化成numpy数组,甚至可以继续转换成torch.*Tensor。 对图片而言,可以使用Pillow库和OpenCV库对视频而言…...
《ARM64体系结构编程与实践》学习笔记(四)
MMU内存管理 1.MMU内存管理(armv8.6手册的D5章节),MMU包含快表TLB,TLB是对页表的部分缓存,页表是存放在内存里面的。 AArch64仅仅支持Long Descriptor的页表格式,AArch32支持两种页表格式Armv7-A Short De…...
01-SDRAM控制器的设计——案例总概述
本教程重点▷▷▷ 存储器简介。 介绍 SDRAM 的工作原理。 详细讲解SDRAM 控制的Verilog 实现方法。 PLL IP和FIFO IP 的调用,计数器设计,按键边沿捕获,数码管控制。 完成SDRAM控制器应用的完整案例。 Signal Tap 调试方法。 准备工作▷…...
京准:NTP卫星时钟服务器对于DeepSeek安全的重要性
京准:NTP卫星时钟服务器对于DeepSeek安全的重要性 京准:NTP卫星时钟服务器对于DeepSeek安全的重要性 在网络安全领域,分布式拒绝服务(DDoS)攻击一直是企业和网络服务商面临的重大威胁之一。随着攻击技术的不断演化…...
uniapp访问django目录中的图片和视频,2025[最新]中间件访问方式
新建中间件, middleware.py 匹配,以/cover_image/ 开头的图片 匹配以/episode_video/ 开头的视频 imageSrc: http://192.168.110.148:8000/cover_image/12345/1738760890657_mmexport1738154397386.jpg, videoSrc: http://192.168.110.148:8000/episode_video/12345/compres…...
RuoYi-Vue-Oracle的oracle driver驱动配置问题ojdbc8-12.2.0.1.jar的解决
RuoYi-Vue-Oracle的oracle driver驱动配置问题ojdbc8-12.2.0.1.jar的解决 1、报错情况 下载:https://gitcode.com/yangzongzhuan/RuoYi-Vue-Oracle 用idea打开,启动: 日志有报错: 点右侧m图标,maven有以下报误 &…...
python脚本实现windows电脑内存监控内存清理(类似rammap清空工作集功能)
import ctypes import psutil import time import sys import os from datetime import datetime import pyautogui# 检查管理员权限 def is_admin():try:return ctypes.windll.shell32.IsUserAnAdmin()except:return False# 内存清理核心功能 def cleanup_memory(aggressivene…...
【狂热算法篇】并查集:探秘图论中的 “连通神器”,解锁动态连通性的神秘力量
嘿,朋友们!喜欢这个并查集的讲解吗 记得点个关注哦,让我们一起探索算法的奥秘,别忘了一键三连,你的支持是我最大的动力! 欢迎拜访:羑悻的小杀马特.-CSDN博客 本篇主题:深度剖析并查…...
SpringBoot中实现动态数据源切换
SpringBoot中实现动态数据源切换 文章目录 SpringBoot中实现动态数据源切换SpringBoot中实现动态数据源切换基础知识1. 什么是数据源?2. 动态数据源切换的概念3. Spring Boot 中的默认数据源配置4. 动态数据源的挑战5. Spring 中的数据源切换方式 设计思路1. 明确应…...
数据结构及排序算法
数据结构 线性结构 ◆线性结构:每个元素最多只有一个出度和一个入度,表现为一条线状。线性表按存储方式分为顺序表和链表。 存储结构: ◆顺序存储:用一组地址连续的存储单元依次存储线性表中的数据元素,使得逻辑上相邻的元素物理上也相邻。 ◆链式存储:存储各数据元素的结点…...
Python基础-元组tuple的学习
在 Python 中,元组(tuple)是一种不可变的序列类型,允许存储不同类型的元素。元组非常类似于列表(list),但与列表不同的是,元组一旦创建,就不能修改其内容。 1 元组的创建…...
【手写公式识别】MEMix: Improving HMER with Diverse Formula Structure Augmentation 论文阅读
发表于:ICME 2024 原文链接:https://ieeexplore.ieee.org/document/10687521 源码:无 Abstract 手写数学表达式识别(HMER)旨在将数学表达式(MEs)的图像转换为相应的LaTeX序列。然而࿰…...
使用deepseek写一个飞机大战游戏
说明: 安装pygame:在运行代码之前,需要先安装 pygame 库。可以通过以下命令安装: pip install pygame图像文件:需要将玩家、敌人和子弹的图像文件(player.png, enemy.png, bullet.png)放在与脚本…...
用Kibana实现Elasticsearch索引的增删改查:实战指南
在大数据时代,Elasticsearch(简称 ES)和 Kibana 作为强大的数据搜索与可视化工具,受到了众多开发者的青睐。Kibana 提供了一个直观的界面,可以方便地对 Elasticsearch 中的数据进行操作。本文将详细介绍如何使用 Kiban…...
C# 封送和远程编程介绍
.NET学习资料 .NET学习资料 .NET学习资料 在 C# 编程领域中,封送(Marshaling)和远程编程(Remote Programming)是两个极为重要的概念,它们为开发者提供了与不同环境、不同进程或不同机器上的代码进行交互的…...
MybatisPlus较全常用复杂查询引例(limit、orderby、groupby、having、like...)
MyBatis-Plus 是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。以下是 MyBatis-Plus 中常用复杂查询(如 LIMIT、ORDER BY、GROUP BY、HAVING、LIKE 等)的引例: 1. 环境准备…...
02.07 TCP服务器与客户端的搭建
一.思维导图 二.使用动态协议包实现服务器与客户端 1. 协议包的结构定义 首先,是协议包的结构定义。在两段代码中,pack_t结构体都被用来表示协议包: typedef struct Pack {int size; // 记录整个协议包的实际大小enum Type type; …...
Jenkins数据备份到windows FTP服务器
文章目录 背景1. 安装配置 FileZilla Server(Windows)1.1 下载并安装 FileZilla Server1.2 配置 FTP 用户和共享目录 2. 安装并配置 FTP 客户端(CentOS)2.1 在 CentOS 安装 lftp 3. 编写 Jenkins 备份脚本3.1 赋予执行权限3.2 测试…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...
【Linux】shell脚本忽略错误继续执行
在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...
树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法
树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...
MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例
一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...
2025季度云服务器排行榜
在全球云服务器市场,各厂商的排名和地位并非一成不变,而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势,对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析: 一、全球“三巨头”…...
C#学习第29天:表达式树(Expression Trees)
目录 什么是表达式树? 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持: 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...
flow_controllers
关键点: 流控制器类型: 同步(Sync):发布操作会阻塞,直到数据被确认发送。异步(Async):发布操作非阻塞,数据发送由后台线程处理。纯同步(PureSync…...
Axure Rp 11 安装、汉化、授权
Axure Rp 11 安装、汉化、授权 1、前言2、汉化2.1、汉化文件下载2.2、windows汉化流程2.3、 macOs汉化流程 3、授权 1、前言 Axure Rp 11官方下载链接:https://www.axure.com/downloadthanks 2、汉化 2.1、汉化文件下载 链接: https://pan.baidu.com/s/18Clf…...
LeetCode 0386.字典序排数:细心总结条件
【LetMeFly】386.字典序排数:细心总结条件 力扣题目链接:https://leetcode.cn/problems/lexicographical-numbers/ 给你一个整数 n ,按字典序返回范围 [1, n] 内所有整数。 你必须设计一个时间复杂度为 O(n) 且使用 O(1) 额外空间的算法。…...
OpenHarmony标准系统-HDF框架之I2C驱动开发
文章目录 引言I2C基础知识概念和特性协议,四种信号组合 I2C调试手段硬件软件 HDF框架下的I2C设备驱动案例描述驱动Dispatch驱动读写 总结 引言 I2C基础知识 概念和特性 集成电路总线,由串网12C(1C、12C、Inter-Integrated Circuit BUS)行数据线SDA和串…...
