目录
一、原题再现
描述
给定一个十进制数M,以及需要转换的进制数N。将十进制数M转化为N进制数
输入描述:
输入为一行,M(32位整数)、N(2 ≤ N ≤ 16),以空格隔开。
输出描述:
为每个测试实例输出转换后的数,每个输出占一行。如果N大于9,则对应的数字规则参考16进制(比如,10用A表示,等等)
示例1
输入:
7 2
输出:
111
二、问题分析
本题题目很简单,题目的本意就是将10进制的数转换成N进制。N的范围是:2 ≤ N ≤ 16。
方法一:这是本人一开始的思路,看似复杂,但运行的时间复杂度和方法二是一样的。首先第一步是将10~16的数转换成ABCDEFG。其关键部分在于进制转换,如下图:将十进制转换成二进制,就是将十进制数除2取余数,得到的余数从后往前拼接得到二进制数,这里有一个栈的概念即为先进后出。
List list = new LinkedList();定一个链表对象用来存储每次得到的余数。将输入的十进制数M除以相应进制数(二进制就是2,十六进制就是16)取余(M%N),如果余数范围在10~16之间,就先将余数进行字符的转变再添加进链表,如果在0~9之间就直接添加进链表。不断进行M/N然后取余。
如果是负数就在最后添加“-”进链表。利用for循环,初值即为添加进链表的最后一个元素,终值即为添加进链表的第一个元素。
方法二:String table = "0123456789ABCDEF"用来表示字符转化更简单方便。利用StringBuilder类存储每次得到的余数,利用StringBuilder类中自带的reverse()方法将最后的结果进行置换。
无论是方法一还是方法二都需要注意关于M是0的情况,如果M是0,无论几进制数得到的结果都是0。
三、完整代码
import java.util.*; public class Main { public static char change(int rem) { char changeChar = ' '; if (rem == 10) { changeChar = 'A'; } else if (rem == 11) { changeChar = 'B'; } else if (rem == 12) { changeChar = 'C'; } else if (rem == 13) { changeChar = 'D'; } else if (rem == 14) { changeChar = 'E'; } else if (rem == 15) { changeChar = 'F'; } else { changeChar = 'G'; } return changeChar; } public static List addList(int M, int N, List list) { while (M != 0) { int rem = M % N; if (rem >= 10 && rem < 16) { char remChar = change(rem); list.add(remChar); } else { list.add(rem); } int inte = M / N; M = inte; } return list; } public static void main(String[] args) { Scanner sc = new Scanner(System.in); int M = sc.nextInt(); int N = sc.nextInt(); List list = new LinkedList(); int sum = 0; if (M == 0) { System.out.print(0); } else if (M < 0) { M = Math.abs(M); list = addList(M, N, list); list.add('-'); } else { list = addList(M, N, list); } for (int i = list.size() - 1; i >= 0; i--) { System.out.print(list.get(i)); } } }
import java.util.*; public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); int m = in.nextInt(); int n = in.nextInt(); boolean flg = false;//代表不是小数 String table = "0123456789ABCDEF"; StringBuilder ret = new StringBuilder(); if (m ==0) { System.out.println(0); } if (m < 0) { m = -m; flg = true; } while(m != 0) { ret.append(table.charAt(m % n)); m = m / n; } if(flg) { ret.append("-"); } ret.reverse(); System.out.println(ret); } }