题目描述
描述
给定一个十进制数M,以及需要转换的进制数N。将十进制数M转化为N进制数
输入描述:
输入为一行,M(32位整数)、N(2 ≤ N ≤ 16),以空格隔开。
输出描述:
为每个测试实例输出转换后的数,每个输出占一行。如果N大于9,则对应的数字规则参考16进制(比如,10用A表示,等等)
示例1
输入:7 2
输出:111
解题
分析
解题思路
举例1:十进制123转换为十进制数。
第一步:123%10 = 3(个位数)
第二步:123/10 = 12,12%10 = 2(十位数)
第三步:12/10 = 1, 1%10 = 1(百位数)
实际输出为321,所以我们还要把这个数字反转过来。
举例2:十进制88转换为八进制数。
第一步:88%8 = 0(低位数)
第二步:88/8 = 11, 11%8 = 3(中位数)
第三步:11/8 = 1, 1%8 = 1(高位数)
实际输出为031,把数字反转过来为八进制数130。
易错点
- 当输入要进制转换的十进制数为负数时。
解决办法:当为负数的时候先转化为正数,最后再加上负号。最后为了识别负号,就要加上一个标志位flag。在负数转化为正数时,flag记录一下。 - 当进制超过10进制时,用A、B、C、D这样的字符代替。
解决办法:设置一个“0123456789ABCDEF“字符串表,把余数当做下标,从这个字符串表中提取数字。 - 当输入要进制转换的十进制数为0时,输出0。
解决办法:这个情况要单独考虑,直接判断要转化的数是否为0,如果为0直接输出0。
代码
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int num1 = sc.nextInt();
int num2 = sc.nextInt();
StringBuffer str = new StringBuffer(); //使用StringBuffer是为了方便添加字符串。
String string = "0123456789ABCDEF"; //定义一个字符串表,为了解决进制超过10的情况。
boolean flag = false; //定义一个标志位,为了记录这个数是否为负数。
if(num1 == 0){ //判断这个数,是否为0,为0直接输出0。
System.out.print("0");
return ;
}
if(num1 < 0){ //判断是否为负数。
num1 = -num1;
flag = true;
}
while(num1 != 0){ //主要代码的实现过程。
str.append(string.charAt(num1%num2));
num1/=num2;
}
if(flag){ //如果为负数,在最后加上一个负号。
str.append('-');
}
str.reverse(); //实现字符串的反转。
System.out.print(str);
}
}