作者:A.y.
日期:2019/6/8
运行环境:eclipse
一、题目要求
题目1. 将非负十进制整数n转换成b进制。(其中b=2~16)
题目2:任何一个正整数都可以用2的幂次方表示。例如:
137=27+23+2^0
同时约定幂次方用括号来表示,即ab 可表示为a(b)。
由此可知,137可表示为:
2(7)+2(3)+2(0)
进一步:7= 22+2+20 (21用2表示)
3=2+2^0
所以最后137可表示为:
2(2(2)+2+2(0))+2(2+2(0))+2(0)
二、题目分析
题目1.
递归:
设置递归函数Exchange(a,b)将十进制数a转换为b进制数,函数返回值为b进制数的字符串形式,首先将递归出口设置为a0;再设置递归体,其中先设置一个字符容器sb,在其末尾添加递归字符串Exchange(a/b,b),根据a%b的不同值添加不同的字符,最后再将字符容器sb转换为字符串的返回值输出。
非递归:
设置函数Exchange(a,b)将十进制数a转换为b进制数,设置字符容器sb,在while()循环中根据a%b的不同值来向sb的首位置添加不同的字符,然后a=a/b进行下一次循环,循环结束条件为a0;循环结束后将sb转换为字符串的返回值并输出。
题目2.
设置函数Exchange(a,b)来输出十进制数的二进制表示,参数a表示该十进制数,b表示二的次方数,设置递归出口为a0&&b<=2。若a!=0,递归调用函数Exchange(a/b,b),调用之后若a%b!=0,判断b的值,若b0,输出+2(0);若b1,输出+2;若b2,输出2(2);否则输出+2(,再递归调用函数Exchange(b,0),调用之后输出)。若a0,判断b的值,若b0,则输出2(0);若b1,则输出2;若b2,则输出2(2);否则输出2(,再递归调用Exchange(b,0),再输出)。
三、递归模型
题目1:
题目2:
四、递归栈
五、运行代码
题目1:
递归
import java.util.*;
public class Exception01 {
public static String Exchange(int a,int b) { //十进制转换n进制函数
String sample; //sample用来表示转换的n进制数
if(a==0) //设置递归出口
{
sample="";
}
else
{
StringBuffer sb = new StringBuffer(); //设置一个字符容器sb
sb.append(Exchange(a/b,b));
switch(a%b)
{
case 10:
sb.insert(sb.length(),"A");
break;
case 11:
sb.insert(sb.length(),"B");
break;
case 12:
sb.insert(sb.length(),"C");
break;
case 13:
sb.insert(sb.length(),"D");
break;
case 14:
sb.insert(sb.length(),"E");
break;
case 15:
sb.insert(sb.length(),"F");
break;
default:
sb.insert(sb.length(),a%b);
break;
}
sample=sb.toString();
}
return sample;
}
public static void main(String[] args) {
int a,b;
Scanner sc = new Scanner(System.in);
System.out.print("输入转换的十进制数:");
a = sc.nextInt();
System.out.print("请输入转换的进制:");
b = sc.nextInt();
System.out.println("转换后的"+b+"进制数为:"+Exchange(a,b)+"("+b+")");
sc.close();
}
}
非递归
import java.util.Scanner;
public class Exception02 {
public static String Exchange(int a,int b) {
String sample;
StringBuffer sb = new StringBuffer();
while(a!=0) {
switch(a%b)
{
case 10:
sb.insert(0,"A");
break;
case 11:
sb.insert(0,"B");
break;
case 12:
sb.insert(0,"C");
break;
case 13:
sb.insert(0,"D");
break;
case 14:
sb.insert(0,"E");
break;
case 15:
sb.insert(0,"F");
break;
default:
sb.insert(0,a%b);
break;
}
a=a/b;
if(a==0) {
sample="";
}
}
sample=sb.toString();
return sample;
}
public static void main(String[] args) {
int a,b;
Scanner sc = new Scanner(System.in);
System.out.print("输入转换的十进制数:");
a = sc.nextInt();
System.out.print("请输入转换的进制:");
b = sc.nextInt();
System.out.println("转换后的"+b+"进制数为:"+Exchange(a,b)+"("+b+")");
sc.close();
}
}
题目2:
import java.util.*;
public class Exception01 {
public static void Exchange(int a,int b) {
if(a==1)
{
switch(b) {
case 0:
System.out.print("2(0)");
break;
case 1:
System.out.print("2");
break;
case 2:
System.out.print("2(2)");
break;
default:
System.out.print("2(");
Exchange(b,0);
System.out.print(")");
break;
}
}
else
{
Exchange(a/2,b+1);
if(a%2==1)
switch(b) {
case 0:
System.out.print("+2(0)");
break;
case 1:
System.out.print("+2");
break;
case 2:
System.out.print("+2(2)");
break;
default:
System.out.print("+2(");
Exchange(b,0);
System.out.print(")");
break;
}
}
}
public static void main(String[] args) {
int number;
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个自然数:");
number = sc.nextInt();
Exchange(number,0);
sc.close();
}
}