算法基础—十六进制转八进制
进制转换
六进制,八进制,二进制,十进制之间的转换是最基本的能力,但有些题目对于新手来说有点难以理解,我拿出一道题来拓展的讲一讲。
进制转换方法:
1、二进制转八进制——取每三位按权相加。
2、二进制转十六进制—取每四位按权相加。
3、二进制转十进制——按权相加。
4、八进制转二进制——熟练掌握二进制转换,做到看到一个数直
接写它的二进制数,再将二进制相连接,不足三位补0,去前导
0。
6、十六进制转二进制—同八进制,注意不足四位补0,去前导0.
7、十进制转八进制——除八取余。
8、十进制转十六进制—除十六取余。
9、十六进制和八进制转十进制通过二进制转换。
问题描述
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由0~~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
【注意】
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
转换进制最简单的方法是使用"iostream"库函数下的格式控制符dec、hex、oct。
#include <iostream>
using namespace std;int main()
{int n;cin>>hex>>n;cout<<oct<<n;return 0;
}
评测一看:错误。回头一看,100000位十六进制,还是老老实实打吧。
有两条路可以走,字符串和数组。我第一感觉字符串想起来简单,直接下手字符串。
string sixteen;cin>>sixteen;string tow;string eight;
首先是十六进制转二进制,我原来打的有点烦了。这是网上传的比较广的一个方法,
for(int j=0; j<sixteen.length(); j++){switch(sixteen[j]){case '0':tow+="0000";break;case '1':tow+="0001";break;case '2':tow+="0010";break;case '3':tow+="0011";break;case '4':tow+="0100";break;case '5':tow+="0101";break;case '6':tow+="0110";break;case '7':tow+="0111";break;case '8':tow+="1000";break;case '9':tow+="1001";break;case 'A':tow+="1010";break;case 'B':tow+="1011";break;case 'C':tow+="1100";break;case 'D':tow+="1101";break;case 'E':tow+="1110";break;case 'F':tow+="1111";break;default:break;}}
二进制转八进制是从右往左每3位按权相加,不足补0。所以我们在转换之前先要确保它是3的整除数。
if(tow.length()%3==1)//1tow="00"+tow; //001if(tow.length()%3==2)tow="0"+tow;
因为要确保不能存在前导0,所以我们拿出前三个来判断他们相加是不是等于0,即他们三个等不等于0:
if(!(tow[0]=='0'&&tow[1]=='0'&&tow[2]=='0')){char temp;temp = (tow[0]-'0')*4+(tow[1]-'0')*2+tow[2];eight += temp;}
‘10’+5, 即‘10’的ASCLL码加上5, 即‘15’的ASCLL码
如果我是char temp=15,那就是ASCLL码为15的值。
然后对后面的进行转换:
for(int j=3; j<tow.length(); j+=3){eight+=(tow[j]-'0')*4+(tow[j+1]-'0')*2+tow[j+2];}
tow[j]是一个字符型,它减去‘0’实际上就是它的ASCLL码值减去‘0’的ASCLL码值,作为数字的它,即等于它的整数型。
也可以用一种更可观的方式,就是码字要多了点:
for(int j=3; j<tow.length(); j+=3){if(tow.substr(j,3)=="000")eight+="0";else if(tow.substr(j,3)=="001")eight+="1";else if(tow.substr(j,3)=="010")eight+="2";else if(tow.substr(j,3)=="011")eight+="3";else if(tow.substr(j,3)=="100")eight+="4";else if(tow.substr(j,3)=="101")eight+="5";else if(tow.substr(j,3)=="110")eight+="6";else if(tow.substr(j,3)=="111")eight+="7";}
这是我做的完整的代码,一开始我以为是输入完十六进制后再一起输出八进制,后来发现输入一个输出一个和一起输入一起输出都是对的。
#include <iostream>
using namespace std;int main()
{int n;cin>>n;for(int i=0; i<n; i++){ string tow;string sixteen;string eight;cin>>sixteen;for(int j=0; j<sixteen.length(); j++){switch(sixteen[j]){case '0':tow+="0000";break;case '1':tow+="0001";break;case '2':tow+="0010";break;case '3':tow+="0011";break;case '4':tow+="0100";break;case '5':tow+="0101";break;case '6':tow+="0110";break;case '7':tow+="0111";break;case '8':tow+="1000";break;case '9':tow+="1001";break;case 'A':case 'a':tow+="1010";break;case 'B':case 'b':tow+="1011";break;case 'C':case 'c':tow+="1100";break;case 'D':case 'd':tow+="1101";break;case 'E':case 'e':tow+="1110";break;case 'F':case 'f':tow+="1111";break;}}if(tow.length()%3==1)tow="00"+tow;if(tow.length()%3==2)tow="0"+tow;if(!(tow[0]=='0'&&tow[1]=='0'&&tow[2]=='0')){char temp;temp = (tow[0]-'0')*4+(tow[1]-'0')*2+tow[2];eight += temp;}for(int j=3; j<tow.length(); j+=3){eight+=(tow[j]-'0')*4+(tow[j+1]-'0')*2+tow[j+2];}cout<<eight<<endl;}return 0;
}
算法基础—十六进制转八进制相关推荐
- 蓝桥杯 试题 基础设计 十六进制转八进制
蓝桥杯 基础试题 十六进制转八进制 题目描述: 给定n个十六进制正整数,输出它们对应的八进制数. 输入格式 输入的第一行为一个正整数n (1<=n<=10).接下来n行,每行一个由0到9, ...
- 【蓝桥杯】基础练习 十六进制转八进制(Java实现)
试题 基础练习 十六进制转八进制 资源限制 时间限制:1.0s 内存限制:512.0MB 问题描述 给定n个十六进制正整数,输出它们对应的八进制数. 输入格式 输入的第一行为一个正整数n (1< ...
- 基础练习 十六进制转八进制 c语言
基础练习 十六进制转八进制 问题描述 给定n个十六进制正整数,输出它们对应的八进制数. 输入格式 输入的第一行为一个正整数n (1<=n<=10). 接下来n行,每行一个由09.大写字母A ...
- java蓝桥杯 试题-基础练习-十六进制转八进制
试题-基础练习-十六进制转八进制 题目 试题 基础练习 十六进制转八进制 资源限制 时间限制:1.0s 内存限制:512.0MB 问题描述 给定n个十六进制正整数,输出它们对应的八进制数. 输入格式 ...
- 蓝桥杯基础练习合集一(C语言) 1.A+B问题2.数列排序3.十六进制转八进制4.十六进制转十进制5.十进制转十六进制
目录 1.A+B问题 2.数列排序 3.十六进制转八进制 4.十六进制转十进制 5.十进制转十六进制 1.A+B问题 问题描述 输入A.B,输出A+B. 输入格式 输入的第一行包括两个整数,由空格分隔 ...
- 基础(一)十六进制转八进制
试题 基础练习 十六进制转八进制 资源限制 内存限制:512.0MB C/C++时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s 问题描述 给定n个十六进制正 ...
- Java算法学习:java进制转换(十进制转八进制,十进制转二进制,十六进制转八进制)
java进制转换(十进制转八进制,十进制转二进制,十六进制转八进制) 这几天在复习C语言的数据结构栈和队列那一章的时候,看到利用栈的特性FILO实现的进制转换十分简洁 想起了java中实现栈的操作十分 ...
- 试题 基础练习 十六进制转八进制
试题 基础练习 十六进制转八进制 问题描述 给定n个十六进制正整数,输出它们对应的八进制数. 输入格式 输入的第一行为一个正整数n (1<=n<=10). 接下来n行,每行一个由09.大写 ...
- Python 蓝桥杯试题 基础练习 十六进制转八进制
Python 蓝桥杯试题 基础练习 十六进制转八进制 问题描述 给定n个十六进制正整数,输出它们对应的八进制数. 输入格式 输入的第一行为一个正整数n (1<=n<=10). 接下来n行, ...
最新文章
- 再读《精通css》03:引入和注释
- The 'Microsoft.Jet.OLEDB.4.0' provider is not registered on the local machine.
- 系统搭建遇到问题3:Ubuntu问题造成网卡名称异常导致Vivado绑定网卡地址的Lic无法正常工作(JESD)...
- 回顾经典,Netflix的推荐系统架构
- 微软允许员工永久在家办公,远程办公时代真的要来临了吗?
- php源码 自定义字段,wordpress主题制作:设置自定义选项字段
- spring的新注解
- 数学建模学习笔记(一) 层次分析法
- FlashFXP用到的功能
- MPSK 通信系统的 Monte Carlo 仿真
- 三种数据交换技术的比较
- Java控制鼠标和键盘的方法
- 关于我对网赚的思路,赚钱的方法透露
- 步进电机基础(2.1)- 定子相数的分类、结构、原理
- NEFU 大一寒假训练十二(set)2020.02.18
- ytb网站报错 “您没有联网,请检查网络连接”
- MySQL——数据库锁原理
- 使用uview中的u-upload上传图片
- C++时间与日期及相关操作
- Linux服务器在线测速