Java——进制转换

一. 题目分析
1.题目
将非负十进制整数n转换成b进制。(其中b=2~16)
2.分析
由题意可知,定义一个有两个参数的递归函数Conversion(n,b)。其中,n表示进行转换的数字,b表示进制。函数的返回值为String。
3.递归函数如下
Conversion(n,b) = Conversion(0,b) n=0
Conversion(n%b,b) n>0
4.在程序中
递归出口: 商为0

if(n==0)	    //递归出口 
		return s;

递归体:商不为0,取余

i = n % b ;		//进制转化计算过程,取余

二 .算法构造
递归树的调用过程:
在这里插入图片描述
三.算法实现
程序源代码如下:

package 进制转换;
import java.util.Scanner;
public class Bconversion {
	@SuppressWarnings({ "resource" })
	public static void main(String[] args) {
		Scanner input=new Scanner(System.in); 
		System.out.print("Please input a non-negetive decimal number:");
		int n=input.nextInt();
		System.out.println("Input the binary(2~16):"); 
		int b=input.nextInt();
		long start=System.currentTimeMillis();
		//判断输入是否正确
		while (true) {
			if (n<0||b>16) {
				System.out.println("Input error,try again:");
				System.out.println("Please input a non-negetive decimal number:"); 
				n=input.nextInt();
				System.out.println("Input the binary(2~16):"); 
				b=input.nextInt();
			}
			else 
				break; 	
		}
		//String s=Conversion(n,b);	//递归方法计算,调用Conversion方法	
		//System.out.println("将"+n+"转化为"+b+"进制为: "+s);  
		String s1=Conversion1(n,b);		//非递归方法计算,调用Conversion1方法
		System.out.println("将"+n+"转化为"+b+"进制为: "+s1); 
		long end=System.currentTimeMillis(); 		
		System.out.println("运行时间为:"+(end-start)+"ms");
	}
	//递归形式
	 public static String Conversion(int n,int b) { 
		String s=new String();	 //用来保存转化后的数 
		int i;
		if(n==0)	 //递归出口 
			return s; 
		i=n%b;	//进制转化计算过程,取余 
		//将计算所取余数存入字符串s 
		switch(i) {
			case 10:s="A"+s;break; 
			case 11:s="B"+s;break;
			case 12:s="C"+s;break; 
			case 13:s="D"+s;break;
			case 14:s="E"+s;break;
			case 15:s="F"+s;break; 
			default:s=i+s;
		} 
		s=Conversion(n/b,b)+s; 	//递归 
		return s; 
	}
	//非递归形式
	public static String Conversion1(int n, int b) {
		String s=new String(); //用来保存转化后的数 
		@SuppressWarnings("unused")
		int i,j; 
		while(n!=0) {
			i=n%b; //进制转化计算过程,取余 
			n=n/b; //进制转化计算过程,改变循环条件值
			//将计算所取余数存入字符串s
			switch(i) { 
				case 10:s="A"+s;break; 
				case 11:s="B"+s;break; 
				case 12:s="C"+s;break; 
				case 13:s="D"+s;break; 
				case 14:s="E"+s;break; 
				case 15:s="F"+s;break;
				default:s=i+s; 
			}
		}
		return s; 
	}
}

四.调试、测试及运行结果
(一)程序调试
递归方法输入11,转换为16进制数
在这里插入图片描述
将11转化为16进制为B,程序结束后计算消耗的时间
在这里插入图片描述
(二)总测试结果
递归形式:
在这里插入图片描述
非递归形式:
在这里插入图片描述
五.经验归纳
(1)十进制的数转成二进制,采用的是取余法,将十进制的数n除以b进制,取其余数,这里得到的余数是b进制数的最后一位。
例如:5转化为2进制,先用5%2得到的是1,这里的1是转化后的二进制数的最后一位,再接着,令n=n/b,即为除得的整数结果, n=5/2=2;再同以上的方法将,2%2=0作为2进制数的倒数第二位。以此类推,2进制数的倒数第三位等于2/2%2=1;这时n=0了,循环到此终止,二进制的数为101。
(2)代码实现时需要逆序输出,考虑到余数需要倒序,可以使用数组方也可以使用switch语句,如下:

String s=new String(); //用来保存转化后的数
//将计算所取余数存入字符串s
switch(i) { 
				case 10:s="A"+s;break; 
				case 11:s="B"+s;break; 
				case 12:s="C"+s;break; 
				case 13:s="D"+s;break; 
				case 14:s="E"+s;break; 
				case 15:s="F"+s;break;
				default:s=i+s;
}

(3)最主要的还是要搞清楚递归函数,递归出口和递归体。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值