一. 题目分析
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)最主要的还是要搞清楚递归函数,递归出口和递归体。