蓝桥杯备赛——进制转化相关问题
目录
一、基础概念
二、问题研究(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 测试…...

Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...
vscode里如何用git
打开vs终端执行如下: 1 初始化 Git 仓库(如果尚未初始化) git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词
Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid,其中有多少个 3 3 的 “幻方” 子矩阵&am…...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)
目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关࿰…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)
上一章用到了V2 的概念,其实 Fiori当中还有 V4,咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务),代理中间件(ui5-middleware-simpleproxy)-CSDN博客…...

使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...

C++:多态机制详解
目录 一. 多态的概念 1.静态多态(编译时多态) 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1).协变 2).析构函数的重写 5.override 和 final关键字 1&#…...
Python Einops库:深度学习中的张量操作革命
Einops(爱因斯坦操作库)就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库,用类似自然语言的表达式替代了晦涩的API调用,彻底改变了深度学习工程…...