考研机试刷题第二天:任意进制转任意进制【高进度短除法】

news/2024/10/30 15:27:43/

理一下思路:

看了y总的视频之后我觉得这道题其实只需要对上次写的进制转换微微做一下调整即可。

于是我写出了下面的代码

#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>using namespace std;vector<int> Change(vector<int> num,int m,int n){vector<int> C;int r = 0;for(int i=num.size()-1;i>=0;i--){//现将现在需要除的数加上上一位余下的数r =  r * m + num[i];//现在将余数塞入数组。C.push_back(r/n);r = r%n;}reverse(C.begin(),C.end());while(!C.empty() && C.back()==0) C.pop_back(); return C;
}int main(){int n,m;cin>>m>>n;string number;cin>>number;vector<int> num;int vn = number.size();for(int i=0;i<vn;i++){num.push_back(number[vn-1-i] - '0');}string str;while(!num.empty()){str += to_string(num[0]%n); num = Change(num,m,n);}reverse(str.begin(),str.end());cout<<str;return 0; 
}

提交之后,发现除了y总写在题面上的样例我是一个测试样例都没过。

 而且我发现题面的测试样例还就是10进制转二进制那。所以我就耐着性子继续看下去。

发现我少考虑了3点

1.十进制转比10进制小的进制在这道题里是极为特殊的情况 而且没有特判

因为如果是上述的情况 我们就可以这样做,因为作为十进制的最后一位%比10小的进制的结果其实就是整个十进制数%比10小的进制的结果。所以可以这样,但是其他情况如十进制转十二进制就不是这么一会事了。

while(!num.empty()){str += to_string(num[0]%n); num = Change(num,m,n);}

应该改为下面的代码 ,r为每次做完一次除法的余数,所以每次出来的除数就可以直接作为答案的一部分入栈

if(number == "0") str ="0";else{while(!num.empty()){r = Change(num,m,n);if(r<10)str += to_string(r);else str += r-10+'a'; }}

2. 在将字符串转为数字数组的过程中,我没有考虑到10以上的进制的特殊处理

for(int i=0;i<vn;i++){num.push_back(number[vn-1-i] - '0');}

应将上述代码改为:

for(int i=0;i<vn;i++){char a = number[vn - 1 -i];if(a>='A') num.push_back(a - 'A' +10);else num.push_back(a - '0');}

 3. 这里不是我的错误,应该算是我的知识盲区

大于十进制的转为十进制

if(a>='A') num.push_back(a - 'A' +10);

十进制转为大于十进制的

else str += r-10+'a'; 

整体代码如下:

#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>using namespace std;int Change(vector<int> &num,int m,int n){vector<int> C;int r = 0;for(int i=num.size()-1;i>=0;i--){//现将现在需要除的数加上上一位余下的数r =  r * m + num[i];//现在将余数塞入数组。C.push_back(r/n);r = r%n;}reverse(C.begin(),C.end());// for(int i=0;i<C.size();i++) cout<<C[i];// cout<<endl;while(!C.empty() && C.back()==0) C.pop_back(); num = C;return r;
}int main(){int n,m;cin>>m>>n;string number;cin>>number;vector<int> num;int vn = number.size();for(int i=0;i<vn;i++){
//2 ----------------------char a = number[vn - 1 -i];if(a>='A') num.push_back(a - 'A' +10);else num.push_back(a - '0');}string str;int r;if(number == "0") str ="0";else{
// 1------------------while(!num.empty()){r = Change(num,m,n);if(r<10)str += to_string(r);else str += r-10+'a'; }}reverse(str.begin(),str.end());cout<<str;return 0; 
}


http://www.ppmy.cn/news/61413.html

相关文章

精品:Stimulsoft Forms 2023.2.2

Stimulsoft Forms 是一种用于创建、编辑、填写、发布、分发交互式表单和收集结果的工具。我们的产品可嵌入到应用程序中&#xff0c;并允许您创建各种自定义填充模板。丰富的功能使模板具有真正的交互性。用户会收到 PDF 格式的可填写表格&#xff0c;他们可以在任何支持此格式…

【性能设计篇】性能设计-缓存

前言 在分布式系统中&#xff0c;最耗费性能的地方就是数据库&#xff0c;而对于数据库的操作基本上就是添加&#xff0c;修改&#xff0c;删除和查询&#xff0c;对于前3者来说&#xff0c;基本上不会出现性能瓶颈。最耗费性能的地方就是查询了&#xff0c;对于查询有join、w…

Axure教程——用中继器制作动态柱状图

今天作者就教大家在Axure里面如何用中继器做一个可以动态的柱状图。 制作完成之应具备以下交互效果&#xff1a; 1.在中继器表格中填写具体数据和坐标轴后&#xff0c;自动生成对应的柱状图 2.鼠标移动到每项&#xff0c;显示其数据 预览地址&#xff1a;https://tj4v11.axshar…

让Python也能读取yaml配置

在 Python 中&#xff0c;可以使用 PyYAML 库来解析和生成 YAML 格式的配置文件&#xff0c;以实现环境配置。以下是一个使用 PyYAML 库读取 YAML 配置文件并将其应用到应用程序中的 Python 代码示例&#xff1a; 安装 PyYAML 库 pip install pyyaml创建 YAML 配置文件 # co…

射频功率放大器在S180肿瘤细胞膜研究中的应用

实验名称&#xff1a;聚焦超声对S180肿瘤细胞膜理化性质的影响 研究方向&#xff1a;生物医疗 测试目的&#xff1a; 细胞膜是细胞生命活动中有着复杂功能的重要结构其基本作用在于维持细胞内外环境的相对稳定而其通透性、完整性及流动性等理化性质则与胞内外信息传递、物质…

天梯赛L1-001 ~ 010

&#x1f442; White Lie - Jhameel - 单曲 - 网易云音乐 &#x1f442; 丁丁猫儿 - 施鑫文月 - 单曲 - 网易云音乐 今年蓝桥 / 天梯都陪跑&#xff0c;希望明年&#xff0c;蓝桥杯省一&#xff08;CA组60分&#xff09;&#xff0c;天梯赛国三&#xff08;180分&#xff09;…

微机作业题

答案做的&#xff0c;正确性不保证。 1. 微型计算机的性能主要取决&#xff08; A &#xff09;的性能。 A. CPU B. 显示器 C. 硬盘 D. U盘 2. 计算机的工作过程&#xff0c;本质是&#xff08; A &#xff09;的过程。 A. 进行科学计算 …

registry私有仓库搭建

目录 一、搭建本地仓库 1、首先下载registry镜像 2、在daemon.json文件中添加私有镜像仓库地址 3、运行registry容器 4、为镜像打标签 5、上传到私有仓库 6、列出私有仓库的所有镜像 7、列出私有仓库的centos 镜像有哪些tag 8、先删除原有的centos的镜像&#xff0c;再…