1. 七进制数
题目:LeetCode504:504. 七进制数 - 力扣(LeetCode)
思路
进制转换,对几转换就是对几求余,最后将所有的余数反过来即可、如果num< 0,先取绝对值,再进行操作。
100转7进制的过程:
代码
public static String convert(int num){
StringBuilder sb = new StringBuilder();
//先拿到正负号,对其转换为正数
boolean sign = num < 0;
if (sign){
num *= -1;
}
while (num > 0){
sb.append( num%7 +"");
num/=7;
}
if (sign)
sb.append("-");
return sb.reverse().toString();
}
2. 进制的转换
题目
给定一个十进制数M,以及需要转换的进制数N,将十进制数转化为N进制数,M是32位整,2<= N <=16。
思路
需要处理的几个问题
- 进制数超过范围的时候出现A,B,C,D,E,F。我们可以定义长度大小为16的数组,保存2到16进制对应值的标记,赋值的时候只计算下标,不考虑不同进制的转换,
- 使用StringBuild完成字符串的反转。
- 用flag标记正负号,最后处理。
代码
//1.余数大于9的情况,
public static final String[] F = {"0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"};
public static String convertn(int M, int N){
Boolean flag = false;
if (M<0){
flag = true;
M *= -1;
}
StringBuffer sb = new StringBuffer();
int temp;
while (M != 0){
//2.整除和取余,第一位余数先获取。
temp = M%N;
sb.append(F[temp]);
M=M/N;
}
sb.reverse();
return (flag?"-":"+") + sb;
}
3. 补充
整数溢出问题
判断是否是大于最大32位整数,要从最大数/10开始判断,最大数是2147483647。
- 如果num>214748364,那么后面就不用再判断肯定溢出了,
- 如果num=214748364,需要跟最大数的末尾数字7对比,如果大于7,则溢出
- 如果num<214748364,则没问题继续处理
代码
if (num >Integer.MAX_VALUE / 10 || num == Integer.MAX_VALUE && num%10 > 7){
return 0;
}
if (num < -Integer.MAX_VALUE / 10 || num == -Integer.MAX_VALUE && num%10 < -8){
return 0;
}