B-10、十进制转十六进制
法一
#include<iostream>
using namespace std;
int main()
{
int n;
cin >> n;
cout << uppercase << hex << n << endl;
return 0;
}
法二,自己实现
#include <iostream>
#include <list>
using namespace std;
int main() {
int n;
char str[16] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
cin>>n;
list<int> ans;
list<int>::iterator iter = ans.begin();
do{
ans.push_back(n % 16);
iter++;
n /= 16;
}while(n);
ans.reverse();
iter = ans.begin();
while(iter != ans.end()){
cout<<str[*iter++];
}
return 0;
}
法三,itoa()
#include <iostream>
#include <stdlib.h>
using namespace std;
int main() {
int n;
cin>>n;
char str[100];
cout << uppercase << itoa(n, str, 16);
// “int to array”还有ltoa gcvt等
// 需要头文件 <stdlib.h>
// 此函数只能输出小写
return 0;
}
另附十进制各转换输出函数:
cout << "35的8进制:" << std::oct << 35<< endl;
cout << "35的10进制" << std::dec << 35 << endl;
cout << "35的16进制:" << std::hex << 35 << endl;
cout << "35的2进制: " << bitset<8>(35) << endl;
// <8>:表示保留8位输出
B-11、十六进制转十进制
法一,直接调用函数
#include <iostream>
using namespace std;
int main() {
long long n;
cin >> hex >> n;
cout << n;
}
法二,自己写函数
#include <iostream>
using namespace std;
int main() {
string num;
cin >> num;
long long ans = 0;
char temp;
int format = 16;//输入的格式
for(int i = 0; i < num.size(); ++i){
temp = num[i];
if(temp >= '0' && temp <= '9'){
ans = ans*format + temp - '0';
}else{
ans = ans*format + 10 + temp - 'A';
}
}
cout << ans;
return 0;
}
法三,strtol()函数
#include <iostream>
#include <stdlib.h>
using namespace std;
int main() {
char str[8];
cin >> str;
cout << strtoull(str ,NULL ,16);
// “string to unsigned long long”
// 需要 <stdlib.h>
// NULL为遇到非法字符返回的指针地址
// 16为str的格进制 ,范围为2~36,若写0则自动猜测进制
return 0;
}
B-12、十六进制转八进制
此题要求的数量很大,所以很麻烦,法一为理解起来最简单的方法
法一
出自 https://www.tuicool.com/articles/22I3Ib
思路简单,switch转二进制,
由于十六进制转二进制和八进制从二进制转换,对应的总二进制位数可能不同,
所以需要在转八进制前进行判断,在开头补“0”,
由于题目要求输出时开头不为“0”,所以输出时对开头也要判断。
#include <iostream>
#include <string>
using namespace std;
int arr[10000001];
int main()
{
int n,len_str,i,j;
string str,str2;
cin>>n;
while(n--)
{
cin>>str;
len_str=str.length();
str2="";
// 十六进制转换为二进制
for(i=0;i<len_str;++i)
{
switch(str[i])
{
case '0':str2+="0000";break;
case '1':str2+="0001";break;
case '2':str2+="0010";break;
case '3':str2+="0011";break;
case '4':str2+="0100";break;
case '5':str2+="0101";break;
case '6':str2+="0110";break;
case '7':str2+="0111";break;
case '8':str2+="1000";break;
case '9':str2+="1001";break;
case 'A':str2+="1010";break;
case 'B':str2+="1011";break;
case 'C':str2+="1100";break;
case 'D':str2+="1101";break;
case 'E':str2+="1110";break;
case 'F':str2+="1111";break;
default:break;
}
}
// 修正位数
if(len_str%3==1) str2="00"+str2;
else if(len_str%3==2) str2="0"+str2;
len_str=str2.length();
// 二进制转换八进制
j=0;
for(i=0;i<=len_str-2;i+=3)
{
arr[j]=(str2[i]-'0')*4+(str2[i+1]-'0')*2+(str2[i+2]-'0');
++j;
}
for(i=0;i<j;++i)
{
if(i==0 && arr[i]==0) continue;
cout<<arr[i];
}
cout<<endl;
}
return 0;
}
法二,从二进制角度来看,三个十六进制数长度与四个八进制数相等,可根据此,转换为二进制,对二进制源码进行操作
https://blog.csdn.net/JiLuoXingRen/article/details/50478759
附上大佬原贴,我着实想不出来,但此方法各方面效率并不比方法一好。
#include <iostream>
#include <string>
#include <math.h>
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int main(int argc, char *argv[]) {
int n=0;
cin>> n;
string* Hex = new string[n];
string tmpOct;
string* Oct = new string[n];
for(int i=0;i<n;i++)
{
int CurBit = 0;
cin>>Hex[i];
tmpOct = "";
Oct[i] = "";
for(int j=Hex[i].size()-3;j>=0;j-=3)
{
int d = 0;
for(int k=0;k<3;k++)
{
int t = j+k;
// 16 To 10
if(Hex[i][t]>='0' && Hex[i][t]<='9')
{
CurBit = Hex[i][t]-'0';
}
if(Hex[i][t]>='A' && Hex[i][t]<='F')
{
CurBit = Hex[i][t]-'A'+10;
}
d = d * 16 + CurBit;
}
// 3bit hex to 4bit oct
int base = 7; // 111B
for(int k=0;k<4;k++)
{
tmpOct += (char)('0' + (d & base));
d = d >> 3;
}
d = 0;
}
// last less three
int rest = Hex[i].size() % 3;
if(rest != 0)
{
int d = 0;
for(int k=0;k<rest;k++)
{
// 16 To 10
if(Hex[i][k]>='0' && Hex[i][k]<='9')
{
CurBit = Hex[i][k]-'0';
}
if(Hex[i][k]>='A' && Hex[i][k]<='F')
{
CurBit = Hex[i][k]-'A'+10;
}
d = d * 16 + CurBit;
}
int base = 7; // 111B
int max = ceil(4.0 / 3.0 * rest);
// 1bit hex = 4/3 bit oct
for(int k=0;k<max;k++)
{
if(((k==max-1) && (d & base)!=0) || k<max-1)
tmpOct += char('0' + (d & base));
d = d >> 3;
}
}
int j=tmpOct.size()-1;
// turn order
for(;j>=0;j--)
{
Oct[i] += tmpOct[j];
}
}
for(int i=0;i<n;i++)
{
cout<<Oct[i]<<endl;
}
cin>>n;
return 0;
}