进制转换

给定一个十进制数M,以及需要转换的进制N。将十进制数转换M转换为N进制数.



如果是正数的话,就很好处理了,可以利用栈结构,求余,然后把余数存到栈里面,最后在出栈就可以了,关于A,B,C,D,E,F的存储,我选择了Map,因为Map的话,查询比较方便。(关于十进制与其他进制如何转换的问题,请自行百度,其实原理和转化为二进制数是差不多,除以N进制,然后求余)。

这一题,一开始没有通过,主要是因为负数的问题,其实一开始对于负数的处理,我想的数,求余,然后取反加1,也就是求补码,但是,后来在网上百度了很多,有人说直接加上负号就可以了,然后,我就试了一下,然后居然过了。。。。。

当为负数的时候,只需要处理两步,一开始的时候判断,如果小于0,则将M变为-M,最后输出结果的时候,再加上负号就可以了(具体的处理是,我们可以在一开始的时候进行判断,如果,一开始M<0,输出负号,即可),详见代码。

附上ac后的代码:

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
import java.util.Stack;
//进制转换
public class Main {


public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
//M表示输入数字,即需要转换的数字
int M = scan.nextInt();
//进制
int N = scan.nextInt();
if( N >0){
convert(M,N);
}
}
public static void convert(int m,int n){
if(m <n){
System.out.print("-");
}
//该栈用来存储余数
Stack stack = new Stack();
Map<Integer,String> map = new HashMap<Integer,String>();
map.put(10,"A");
map.put(11,"B");
map.put(12,"C");
map.put(13, "D");
map.put(14,"E");
map.put(15,"F");
//如果传入的n为十进制,则直接输出即可
if(n == 10){
System.out.println(m);
return ;
}
int e;//表示余数
if(m<0){
m = -m;
}
while(m>0){
//求余,得到余数,余数决定最后放到栈中的数据
e = m%n;
if(n <10){//如果n小于9,则余数为多少,就在栈中存储多少
stack.push(e);
}else{//如果要求进制大于10,则对余数大于还是小于9进行判断
stack.push(e>9 ? map.get(e):e);
}
m = m/n;
}
//输出

while(!stack.isEmpty()){
System.out.print(stack.pop());
}
}


}

关于为什么负号能直接加负号处理,我其实不太能理解,网上有大牛说思想跟在线进制转换工具类似。但是,我还不懂

如果哪位小伙伴有好多解释,请多多指教一下我这个萌新,靴靴了。

使用在线进制转换工具,负数直接加负号,但是使用计算器进行进制转换就不是直接加负号。题目中说了N为32位整型数,范围为-2^31与2^31-1之间,肯定会有负数,所以思想跟那个在线进制转换工具类似。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值