蓝桥杯备赛——进制转化相关问题

目录

一、基础概念

二、问题研究(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 进制数并输出。

详细步骤
  1. 初始化变量

    • p 用于存储 base 的幂次,初始化为 1。
    • k 用于存储当前位的数字。
  2. 计算 p 的值

    • 使用 while 循环不断将 p 乘以 base,直到 p 大于 num。此时 p 是 base 的某个幂次,且这个幂次是使得 p 大于 num 的最小幂次。
    • 然后将 p 除以 base,得到最大的小于等于 num 的 base 的幂次。
  3. 循环求 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 函数进行转换。

详细步骤
  1. 初始化变量

    • num 用于存储用户输入的要转换的十进制数,初始化为 0。
    • base 用于存储用户输入的目标进制,初始化为 0。
  2. 获取用户输入

    • 使用 printf 函数提示用户输入要转换的数,然后使用 scanf 函数读取用户输入并存储到 num 中。
    • 使用 printf 函数提示用户输入目标进制,然后使用 scanf 函数读取用户输入并存储到 base 中。
  3. 调用 transfer 函数

    • 调用 transfer 函数,将 num 和 base 作为参数传递给该函数进行转换。
  4. 返回值

    • 程序正常结束,返回 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 进制数并输出。

详细步骤

  1. 递归条件判断

    • if (n >= x):如果当前的十进制数 n 大于或等于目标进制 x,说明 n 还可以继续分解为更高位的 x 进制数。
    • print(n / x, x):递归调用 print 函数,将 n 除以 x 的商作为新的 n 继续进行转换。这样做的目的是先处理高位的 x 进制数,因为递归会不断深入,直到处理到最高位。
  2. 输出当前位数字

    • 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 函数进行转换和输出。

详细步骤

  1. 变量初始化

    • int n = 0;:定义并初始化一个整型变量 n,用于存储用户输入的要转换的十进制数。
    • int x = 0;:定义并初始化一个整型变量 x,用于存储用户输入的目标进制。
  2. 获取用户输入

    • cin >> n >> x;:使用标准输入流 cin 从用户那里读取两个整数,分别存储到 n 和 x 中。
  3. 调用 print 函数

    • print(n, x);:调用 print 函数,将 n 转换为 x 进制数并输出。
  4. 返回值

    • 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;:依次从标准输入读取源进制 nn 进制的字符串 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 = 16s = "FF"m = 10

  1. stoi(s, NULL, n) 会将十六进制字符串 "FF" 转换为十进制数 255,存储在 num 中。
  2. 调用 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/14308.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Unity3D引擎首次用于光伏仿真设计软件爆火

在光伏设计领域&#xff0c;绿虫光伏仿真设计软件宛如一匹黑马&#xff0c;凭借其基于 Unity3D 引擎的强大功能&#xff0c;为行业带来了全新的解决方案。借助 Unity3D 引擎技术&#xff0c;实现了游戏级高清画面&#xff0c;2D/3D 自由转换&#xff0c;让场景代入感极强&#…

寒假2.6--SQL注入之布尔盲注

知识点 原理&#xff1a;通过发送不同的SQL查询来观察应用程序的响应&#xff0c;进而判断查询的真假&#xff0c;并逐步推断出有用的信息 适用情况&#xff1a;一个界面存在注入&#xff0c;但是没有显示位&#xff0c;没有SQL语句执行错误信息&#xff0c;通常用于在无法直接…

有用的sql链接

『SQL』常考面试题&#xff08;2——窗口函数&#xff09;_sql的窗口函数面试题-CSDN博客 史上最强sql计算用户次日留存率详解&#xff08;通用版&#xff09;及相关常用函数 -2020.06.10 - 知乎 (zhihu.com) 1280. 学生们参加各科测试的次数 - 力扣&#xff08;LeetCode&…

排序算法--基数排序

核心思想是按位排序&#xff08;低位到高位&#xff09;。适用于定长的整数或字符串&#xff0c;如例如&#xff1a;手机号、身份证号排序。按数据的每一位从低位到高位&#xff08;或相反&#xff09;依次排序&#xff0c;每次排序使用稳定的算法&#xff08;如计数排序&#…

将Deepseek接入pycharm 进行AI编程

目录 专栏导读1、进入Deepseek开放平台创建 API key 2、调用 API代码 3、成功4、补充说明多轮对话 总结 专栏导读 &#x1f338; 欢迎来到Python办公自动化专栏—Python处理办公问题&#xff0c;解放您的双手 &#x1f3f3;️‍&#x1f308; 博客主页&#xff1a;请点击——…

14:00面试,14:06就出来了,问的问题有点变态。。。

从小厂出来&#xff0c;没想到在另一家公司又寄了。 到这家公司开始上班&#xff0c;加班是每天必不可少的&#xff0c;看在钱给的比较多的份上&#xff0c;就不太计较了。没想到2月一纸通知&#xff0c;所有人不准加班&#xff0c;加班费不仅没有了&#xff0c;薪资还要降40%…

DeepSeek:知识图谱与大模型参数化知识融合的创新架构

引言&#xff1a;AI 领域的融合趋势 在目前大模型与知识图谱作为两个重要的研究方向&#xff0c;各自展现出了强大的能力与潜力。大模型&#xff0c;凭借其在海量数据上的深度训练&#xff0c;拥有强大的语言理解与生成能力&#xff0c;能够处理多种自然语言处理任务&#xff0…

69.弹窗显示复杂的数据框图 C#例子 WPF例子

这是一个复杂的功能实现&#xff0c;其中日志管理器的一个实例包含需要被绑定的数据源。由于主窗口被复杂的内容填满&#xff0c;因此需要设计一个弹窗来专门显示数据框图。以下是实现步骤&#xff1a; 设计主页面&#xff1a; 在主页面上添加一个按钮和一个数据框图&#xf…

分布式微服务系统架构第91集:系统性能指标总结

加群联系作者vx&#xff1a;xiaoda0423 仓库地址&#xff1a;https://webvueblog.github.io/JavaPlusDoc/ 系统性能指标总结 系统性能指标包括哪些&#xff1f; 业务指标、资源指标、中间件指标、数据库指标、前端指标、稳定性指标、批量处理指标、可扩展性指标、可靠性指标。 …

Pygame介绍与游戏开发

提供pygame功能介绍的文档&#xff1a;Pygame Front Page — pygame v2.6.0 documentation 基础语法和实现逻辑 与CLI不同&#xff0c;pygame提供了图形化使用界面GUI&#xff08;graphical user interface&#xff09;基于图像的界面可以创建一个有图像和颜色的窗口 要让py…

网络安全威胁框架与入侵分析模型概述

引言 “网络安全攻防的本质是人与人之间的对抗&#xff0c;每一次入侵背后都有一个实体&#xff08;个人或组织&#xff09;”。这一经典观点概括了网络攻防的深层本质。无论是APT&#xff08;高级持续性威胁&#xff09;攻击、零日漏洞利用&#xff0c;还是简单的钓鱼攻击&am…

FPGA|生成jic文件固化程序到flash

1、单击file-》convert programming files 2、flie type中选中jic文件&#xff0c;configuration decive里根据自己的硬件选择&#xff0c;单击flash loader选择右边的add device选项 3、选择自己的硬件&#xff0c;单击ok 4、选中sof选项&#xff0c;单机右侧的add file 5、选…

P3654 First Step (ファーストステップ)(贪心算法)

#include<bits/stdc.h> using namespace std;int main() {int r,c,k;cin>>r>>c>>k;char a[105][105];int ans0;for(int i0;i<r;i){for(int j0;j<c;j){cin>>a[i][j];}}for(int i0;i<r;i){int cnt0; // 用来记录连续空地的数量for(int j…

Java/Kotlin双语革命性ORM框架Jimmer(一)——介绍与简单使用

概览 Jimmer是一个Java/Kotlin双语框架 包含一个革命性的ORM 以此ORM为基础打造了一套综合性方案解决方案&#xff0c;包括 DTO语言 更全面更强大的缓存机制&#xff0c;以及高度自动化的缓存一致性 更强大客户端文档和代码生成能力&#xff0c;包括Jimmer独创的远程异常 …

ASP.NET Core中Filter与Middleware的区别

中间件是ASP.NET Core这个基础提供的功能&#xff0c;而Filter是ASP.NET Core MVC中提供的功能。ASP.NET Core MVC是由MVC中间件提供的框架&#xff0c;而Filter属于MVC中间件提供的功能。 区别 中间件可以处理所有的请求&#xff0c;而Filter只能处理对控制器的请求&#x…

ASP.NET Core对JWT的封装

目录 JWT封装 [Authorize]的注意事项 JWT封装 NuGet 库 |Microsoft.AspNetCore.Authentication.JwtBearer 9.0.1https://www.nuget.org/packages/Microsoft.AspNetCore.Authentication.JwtBearerhttps://www.nuget.org/packages/Microsoft.AspNetCore.Authentication.JwtBea…

【Uniapp-Vue3】从uniCloud中获取数据

需要先获取数据库对象&#xff1a; let db uniCloud.database(); 获取数据库中数据的方法&#xff1a; db.collection("数据表名称").get(); 所以就可以得到下面的这个模板&#xff1a; let 函数名 async () > { let res await db.collection("数据表名称…

腾讯云TI平台×DeepSeek:开启AI超强体验,解锁部署秘籍

引言 在人工智能飞速发展的今天&#xff0c;AI技术的应用场景已经渗透到我们生活的方方面面。从智能客服到自动驾驶&#xff0c;从精准医疗到金融科技&#xff0c;AI的应用正在不断推动各行业的变革与创新。作为AI领域的领军企业&#xff0c;腾讯云一直以来都在致力于为开发者…

利用 IMU 估计人体关节轴向和位置 —— 论文推导

Title: 利用 IMU 估计人体关节轴向和位置 —— “Joint axis and position estimation from inertial measurement data by exploiting kinematic constraints” —— 论文推导 文章目录 I. 论文回顾II. 铰接关节的约束1. 铰接关节约束的原理2. 铰接关节约束的梯度3. 铰接关节约…

pushgateway指标聚合问题

一 问题现象 一个job有多个实例推送指标&#xff0c;但是从pushgateway上看这个job的instance字段&#xff0c;只显示一个实例的ip&#xff0c;而不是多个实例。导致在grafana上无法正常根据ip查看监控。 应用的prometheus的配置 management:metrics:tags:application: ${spr…