进制转换是非常重要的内容,考察基本功,4月底在字节跳动的春招笔试中做到了进制转换的题,不过是大整数的进制转换。
题目大意:
十进制数转16进制,会出现超大数字的情况,大小超过64位正整数的表示范围,不能使用系统库进行进制转换。
输入:
一个十进制数字
输出:
输出该十进制数对应的16进制数。
大概有以下几种解法:
(1)当场手写大整数包(C++);
(2)模拟大整数的笔算(模拟小学学的除法)
(3)用java中的BigInteger类进行运算;
显然,第一种方法不太明智,杀鸡焉用宰牛刀,后两者可以尝试:
解题1:模拟笔算
个人认为这个是轻巧的方法,里面含有许多小技巧。
实现代码如下:
#include<bits/stdc++.h>
using namespace std;
int main()
{
while(1)
{
cout<<"输入十进制数"<<endl;///****************1.输入
string str;
cin>>str;
int len=str.size();
for(int i=0;i<len;i++)///****************2.异常处理
{
if(str[i]<48||str[i]>57) //0的ascll码是48,9的ascll码值为57
{
cout<<"输入了非法字符"<<endl;
return 0;
}
}
string result=""; ///****************3.正式处理
string hex="0123456789abcdef";
int i=0;
char cnt2='0';
while(1)
{
while(i<len&&str[i]=='0')
i++;
if(i>=len)
break;
int cnt=0;
for(;i<len;i++)
{
int sum=cnt*10+(str[i]-'0');
str[i]=char(sum/16+'0'); //因为sum不会超过159,sum/16不会超过10,不会超过8位二进制表示,
cnt=sum%16; //因此不会因为int转成char被截断而有误差。
cnt2=hex[sum%16];
}
i=0;
result=cnt2+result;
}
if(result=="") //输入为0的时候,结果就是0;
{
cout<<0<<endl;
return 0;
}
cout<<result<<endl;
}
return 0;
}
解题2:运用java中的BigInteger类
package systemconvert10_16;
import java.util.Scanner;
import java.math.BigInteger;
public class convert10_16{
public static void main(String[] args) {
Scanner scanner10=new Scanner(System.in);
String str=scanner10.nextLine();
String result=new java.math.BigInteger(str,10).toString(16);
System.out.println("16进制结果为:"+result);
scanner10.close();
}
}
String outputstr=new BigInterger(str,radix1).toString(radix2);
str:要转换的数(string类型);
radix1:要转换的数的进制;
radix2:目标进制。
返回大整数类型数据的字符串表示结果
参考博客:
大整数除法(进制转换)
https://blog.csdn.net/chengsilin666/article/details/81412162
利用java中的BigInteger实现进制转换
https://www.cnblogs.com/numen-fan/p/6500914.html
java中的BigInteger(很好很强大)(转)
https://blog.csdn.net/w00w12l/article/details/7290750