1.题目名称
将非负十进制整数n转换成b进制。(其中b=2~16)
2.算法构造
(1)递归:
十进制数对b进制取余,若b进制为1-9进制,将余数写入字符串;进制数为10-16时,将余数用相应的字符表示。然后利用递归模型返回十进制数和b进制的值,最后利用StringBuilder实现逆序输出字符串
递归模型:duigui(n,b)= duigui(n/b,b) n>=0
递归出口:n<b
(其中为是十进制数,b为进制数)
(2)非递归:
当十进制数不为0时,十进制数对b进制取余,十进制数变为原来的十进制数/b进制。若b进制为1-9进制,将余数写入字符串;进制数为10-16时,将余数用相应的字符表示,最后利用StringBuilder实现逆序输出字符串
5.经验归纳
5.1遇到的问题
<1>刚开始用的是数组,结果发现不用循环很难把字符赋给数组
<2>逆序输出那里考虑不周全
<3>用递归树或者递归栈描述调用过程
5.2心得体会
这次的基本要求没有什么难点,主要就是递归函数的建立,非递归比递归简单一些,就是在最后的逆序输出那里会遇到问题,上网查了一下,说是可以用StringBuffer来实现,所以基本上没什么大问题。对了~画出递归树或者递归栈的调用过程这里也是问题,第一次画,对这个概念不是很熟悉。
附:源代码
1.Test0类(主方法):
package interest;
import java.util.Scanner;
public class Test0
{
static int n;
static int b;
public static void main(String[] args)
{
Scanner sc=new Scanner(System.in);
TwoMethods t=new TwoMethods();
System.out.println("请输入一个非负整数:");
n=sc.nextInt();
while(true)
{
if(n<0)
{
System.out.println("Error!请输入一个非负整数:");
n=sc.nextInt();
}
else
break;
}
System.out.println("请输入你想转换的进制(1-16):");
b=sc.nextInt();
while(true)
{
if(b<1||b>16)
{
System.out.println("Error!请输入你想转换的进制(1-16):");
b=sc.nextInt();
}
else
break;
}
System.out.println("你想使用哪种方法进行运算?1.递归 2.非递归(1/2):");
int x=sc.nextInt();
switch(x)
{
case 1: //调用递归方法
t.digui(n,b);
break;
case 2:
t.feidigui(n,b);//调用非递归方法
break;
}
sc.close();
}
}
2.两种方法实现转换:
package interest;
public class TwoMethods
{
static String a=""; //定义一个字符串,用来存储b进制
static int num; //b进制数
public static void feidigui(int n,int b) //非递归
{
while(n>0) //当十进制数不为0时
{
num=n%b; //十进制数对b进制取余
n=n/b; //十进制数变为原来的十进制数/b进制
if(b<10) //若b进制为1-9进制
{
a+=num; //将余数写入字符串
}
else //进制数为10-16时
{
a+=((char)(num-10)+'A'); //将余数用相应的字符表示
}
}
System.out.println("用非递归方法计算的十进制转"+b+"进制的转换结果是:");
System.out.println(new StringBuilder(a).reverse().toString()); //利用StringBuilder实现逆序输出字符串
}
public void digui(int n,int b) //递归
{
if(n!=0)
{
num=n%b; //十进制数对b进制取余
if(b<10) //若b进制为1-9进制
{
a+=num; //将余数写入字符串
}
else //进制数为10-16时
{
a+=((char)(num-10)+'A'); //将余数用相应的字符表示
}
digui(n/b,b); //利用递归模型返回十进制数和b进制的值
}
else
{
System.out.println("用递归方法计算的十进制转"+b+"进制的转换结果是:");
System.out.println(new StringBuilder(a).reverse().toString()); //利用StringBuilder实现逆序输出字符串
}
}
}