蓝桥杯备赛——进制转化相关问题
目录
一、基础概念
二、问题研究(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 测试…...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...
第25节 Node.js 断言测试
Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序
一、开发环境准备 工具安装: 下载安装DevEco Studio 4.0(支持HarmonyOS 5)配置HarmonyOS SDK 5.0确保Node.js版本≥14 项目初始化: ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...
k8s业务程序联调工具-KtConnect
概述 原理 工具作用是建立了一个从本地到集群的单向VPN,根据VPN原理,打通两个内网必然需要借助一个公共中继节点,ktconnect工具巧妙的利用k8s原生的portforward能力,简化了建立连接的过程,apiserver间接起到了中继节…...
CMake控制VS2022项目文件分组
我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...
是否存在路径(FIFOBB算法)
题目描述 一个具有 n 个顶点e条边的无向图,该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序,确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数,分别表示n 和 e 的值(1…...
JVM 内存结构 详解
内存结构 运行时数据区: Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器: 线程私有,程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 每个线程都有一个程序计数…...
C#学习第29天:表达式树(Expression Trees)
目录 什么是表达式树? 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持: 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...
沙箱虚拟化技术虚拟机容器之间的关系详解
问题 沙箱、虚拟化、容器三者分开一一介绍的话我知道他们各自都是什么东西,但是如果把三者放在一起,它们之间到底什么关系?又有什么联系呢?我不是很明白!!! 就比如说: 沙箱&#…...
大模型真的像人一样“思考”和“理解”吗?
Yann LeCun 新研究的核心探讨:大语言模型(LLM)的“理解”和“思考”方式与人类认知的根本差异。 核心问题:大模型真的像人一样“思考”和“理解”吗? 人类的思考方式: 你的大脑是个超级整理师。面对海量信…...
