蓝桥杯备赛——进制转化相关问题
目录
一、基础概念
二、问题研究(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 函数 代码功能概述 详细步骤 三、运用递归解决 (一) 代码如下: 代码解读: &#…...
Nginx配置 ngx_http_proxy_connect_module 模块及安装
1、配置完互联网yum源后,安装相关依赖软件包 [root@server soft]# yum install -y patch pcre pcre-devel make gcc gcc-c++ openssl openssh [root@server soft]# yum install openssl* 2、解压缩软件,加载模块 [root@server soft]# ls nginx-1.20.2 nginx-1.20.2.tar.gz …...
WebSocket推送数据快,条数多导致前端卡顿问题解决
WebSocket推送数据快,条数多导致前端卡顿问题解决 前言方案优化消息频率使用高效的数据格式Protobuf 和 MessagePack的对比 启用压缩前端性能优化 WebSocket使用注意事项连接管理处理断开连接负载均衡监控和维护日志记录定期维护安全最佳实践限流 最后 前言 在项目…...
网络爬虫技术如何影响网络安全的
随着网络的发展和网络爬虫技术的普及,一些人收集某些需要的信息,会使用网络爬虫进行数据抓取。网络爬虫一方面会消耗网络系统的网络资源,同时可能会造成核心数据被窃取,因此对企业来讲如何反爬虫显得非常重要。 一、什么是网络爬…...
基于蒙特卡洛思想生成电动汽车充电负荷曲线
本程序基于蒙特卡洛思想生成电动汽车充电负荷曲线,利用第十一届电工杯所提供的数据(充电开始时间,充电电量,充电功率)得到一万台电动汽车充电负荷曲线。蒙特卡洛只是解决问题的一种思想,本程序可为其他利用…...
Redis深入学习
目录 Redis是什么? Redis使用场景 Redis线程模型 Redis执行命令是单线程的为什么还这么快? Redis持久化 Redis 事务 Key 过期策略 Redis 和 mysql 如何保证数据一致? 缓存穿透 缓存击穿 缓存雪崩 Redis是什么? redis是一…...
kamailio中路由模块汇总
功能模块描述请求路由 (request_route)主要处理进入的SIP请求,包含初步检查、NAT检测、CANCEL请求处理、重传处理等。处理通过REQINIT、NATDETECT、RELAY等子模块的调用。CANCEL处理对CANCEL请求进行处理,包括更新对话状态并检查事务。如果事务检查通过&…...
EasyExcel 导出合并层级单元格
EasyExcel 导出合并层级单元格 一、案例 案例一 1.相同订单号单元格进行合并 合并结果 案例二 1.相同订单号的单元格进行合并2.相同订单号的总数和总金额进行合并 合并结果 案例三 1.相同订单号的单元格进行合并2.相同订单号的商品分类进行合并3.相同订单号的总数和总金额…...
青少年编程与数学 02-009 Django 5 Web 编程 01课题、概要
青少年编程与数学 02-009 Django 5 Web 编程 01课题、概要 一、Django 5Django 5 的主要特性包括: 二、MVT模式三、官方网站四、内置功能数据库 ORM(对象关系映射)用户认证和授权表单处理模板引擎URL 路由缓存框架国际化和本地化安全性功能管…...
Oracle认证大师(OCM)学习计划书
Oracle认证大师(OCM)学习计划书 一、学习目标 Oracle Certified Master(OCM)是Oracle官方认证体系中的最高级别认证,要求考生具备扎实的数据库管理技能、丰富的实战经验以及解决复杂问题的能力。本计划旨在通过系统化的…...
2.7学习
crypto buu-还原大师 仔细阅读题目,这里有一段字符串,但是其中有四个大写字母被替换成了‘?’,那么我们写脚本:首先将四个问号均换成26个大写字母并且组成不同的组合, 所以有四个循环让四个问号都遍历26个…...
oracle ORA-27054报错处理
现象 在oracle执行expdp,rman备份,xtts的时候,由于没有足够的本地空间,只能使用到NFS的文件系统但有时候会出现如下报错 ORA-27054: NFS file system where the file is created or resides is not mounted with correct options根据提示信…...
核显是什么
核显(Integrated Graphics,集成显卡)是指集成在中央处理器(CPU)或者主板上的显卡。与独立显卡不同,核显不需要额外的显卡硬件,而是直接使用系统内存(RAM)和处理器的资源来…...
使用LLaMA Factory踩坑记录
前置条件:电脑显卡RTX 4080 问题:LLaMA-Factory在运行的时候,弹出未检测到CUDA的报错信息 结论:出现了以上的报错,主要可以归结于以下两个方面: 1、没有安装GPU版本的pytorch,下载的是CPU版本…...
在qtcreator中添加片段,提高开发效率。
文件名:text.xml <?xml version"1.0" encoding"utf-8"?> <snippets><!-- 版权声明 --><snippet group"Text" trigger"copyright" id"comment_copyright">/*!* file %{CurrentDocum…...
redis的数据结构介绍(string
redis是键值数据库,key一般是string类型,value的类型很多 string,hash,list,set,sortedset,geo,bitmap,hyperlog redis常用通用命令: keys: …...
ASP.NET Core JWT Version
目录 JWT缺点 方案 实现 Program.cs IdentityHelper.cs Controller NotCheckJWTVersionAttribute.cs JWTVersionCheckkFilter.cs 优化 JWT缺点 到期前,令牌无法被提前撤回。什么情况下需要撤回?用户被删除了、禁用了;令牌被盗用了&…...
电路研究9.3——合宙Air780EP中的AT开发指南(含TCP 示例)
根据合宙的AT研发推荐, AT指令基本上也简单看完了,这里开始转到AT的开发了。 AT 命令采用标准串口进行数据收发,将以前复杂的设备通讯方式转换成简单的串口编程, 大大简化了产品的硬件设计和软件开发成本,这使得几乎所…...
Reqable使用实践
一、背景 日常开发中,难免要抓取请求数据,查看接口数据,从而更好定位问题,基于这个原因,查找了一些抓包工具,例如: HttpCanary、 Steam 、Fiddler等,不是要钱,就是只对苹…...
【蓝桥杯嵌入式】2_LED
全部代码网盘自取 链接:https://pan.baidu.com/s/1PX2NCQxnADxYBQx5CsOgPA?pwd3ii2 提取码:3ii2 1、电路图 74HC573是八位锁存器,当控制端LE脚为高电平时,芯片“导通”,LE为低电平时芯片“截止”即将输出状态“锁存”…...
Flink 调用海豚调度器 SQL 脚本实现1份SQL流批一体化的方案和可运行的代码实例
目录 一、流批一体化概述 二、Flink 与海豚调度器结合实现流批一体化的好处 2.1 代码复用性增强 2.2 开发和维护成本降低 2.3 数据一致性保证 2.4 提高系统的灵活性和可扩展性 三、实现思路步骤 3.1 环境准备 3.2 编写 SQL 脚本并上传到海豚调度器 3.3 实现资源下载功…...
B树详解及其C语言实现
目录 一、B树的基本原理 二、B树操作过程图形化演示 三、B树的应用场景 四、C语言实现B树及示例 五、代码执行结果说明 六、应用实例:文件系统目录索引 七、总结 一、B树的基本原理 B树(B-Tree) 是一种自平衡的树数据结构,…...
【Go语言快速上手】第二部分:Go语言进阶
文章目录 并发编程goroutine:创建和调度 goroutinechannel:无缓冲 channel、有缓冲 channel、select 语句无缓冲 channel有缓冲 channelselect 语句 sync 包:Mutex、RWMutex、WaitGroup 等同步原语Mutex:互斥锁RWMutex:…...
ARM64 Linux 内核学习指南:从基础到实践
前言 ARM64 作为当今主流的处理器架构,被广泛应用于移动设备、嵌入式系统和服务器领域。学习 ARM64 在 Linux 内核中的实现,不仅有助于深入理解操作系统底层机制,还能提升在内核开发、驱动编写、虚拟化等领域的专业能力。 本指南面向对 Lin…...
零基础都可以本地部署Deepseek R1
文章目录 一、硬件配置需求二、详细部署步骤1. 安装 Ollama 工具2. 部署 DeepSeek-R1 模型3. API使用4. 配置图形化交互界面(可选)5. 使用与注意事项 一、硬件配置需求 不同版本的 DeepSeek-R1 模型参数量不同,对硬件资源的要求也不尽相同。…...
掌握Spring @SessionAttribute:跨请求数据共享的艺术
SessionAttribute注解在Spring中的作用,就像是一个“数据中转站”。 在Web应用中,我们经常需要在多个请求之间共享数据。比如,用户登录后,我们需要在多个页面或请求中保持用户的登录状态。这时,SessionAttribute注解就…...
视频采集卡接口
采集卡的正面有MIC IN、LINE IN以及AUDIO OUT三个接口, MIC IN为麦克风输入,我们如果要给采集到的视频实时配音或者是在直播的时候进行讲解,就可以在这里插入一个麦克风, LINE IN为音频线路输入,可以外接播放背景音乐…...
64【32与64位程序的区别】
很多人可能有一个观念,那就是64位的程序NB,有技术含量,但是要说nb在哪,很多人又说不上来,本节来对这个问题做一个探讨 下图中左边的是加载的64程序,右边的是32位程序, 在上一节课我们已经理解…...
ai智能DeepSeek 在 Cursor 中的配置与应用实践
DeepSeek 是一款高效的深度搜索引擎,能够为开发者提供更智能、更精准的搜索体验。在数据量大、查询复杂的场景中,DeepSeek 能够帮助提升查询的响应速度和精确度。本文将介绍 DeepSeek 在 Cursor 中的配置与应用,帮助开发者理解如何在实际开发…...
Deepseek的起源与发展
文章目录 前言一、Deepseek的起源二、DeepSeek的发展脉络三、Deepseek的突破与优势(1)功能强大:核心能力与应用场景(2)性能优势:效率与效果的革命性提升四、Deepseek开源引发关注前言 DeepSeek 在网络安全领域带来的新机遇,DeepSeek 从崭露头角到引领 AI 领域的重大变革,已…...
