一.题目
将非负十进制整数n转换成b进制。(其中b=2~16)
要求:
1.采用递归思想编程解决问题,要求设计出递归模型(递归出口和递归体的函数式)。
2.程序设计风格良好,实现功能测试代码,确保程序的健壮性。
3.画出递归树或者递归栈的调用过程。
4.实现非递归方法。
二.算法设计
将十进制n转换成任意进制b的方法是:n除以b取余作为转换后的数的最低位,在商不为0的情况下,则商继续除以b,取余作为次低位,直到商为0为止。定义一个有两个参数的递归函数digui(n,b)。其中,n表示进行转换的数字,b表示进制。
递归代码:
当n=5,b=2时,上述递归算法的递归栈过程示意图为:
三、代码
递归:
public class digui {
public String digui(int n,int b) {
String s=new String();//存储递归方法转换后的值
if(n==0){//递归出口
return s;
}
else{
int i=n%b;
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=digui(n/b,b)+s;
return s;
}
}
}
非递归:
public class feidigui{
public String feidigui(int n,int b) {
String s=new String();//存储递归方法转换后的值
if(n==0){
return s;
}
while(n!=0){
int i=n%b;
n=n/b;
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;
}
}
测试:
public class Test {
public static void main(String[] args) {
digui dg=new digui();
feidigui fdg=new feidigui();
Scanner sc=new Scanner(System.in);
System.out.println("请输入你想要转换的非负十进制整数:");
int n=sc.nextInt();
while(n<0){
System.out.println("输入错误!请重新输入你想要转换的非负十进制数:");
n=sc.nextInt();
}
System.out.println("请输入你要转换的进制(2~16):");
int b=sc.nextInt();
while(b<2||b>16){
System.out.println("输入错误!请重新输入你要转换的进制(2~16):");
b=sc.nextInt();
}
sc.close();
System.out.println("递归方法:");
String s=dg.digui(n,b);
System.out.println("十进制数"+n+"转化为"+b+"进制为:"+s);
System.out.println("非递归方法:");
String s1=fdg.feidigui(n,b);
System.out.println("十进制数"+n+"转化为"+b+"进制为:"+s1);
}
}
四、测试截图