将非负十进制整数n转换成b进制
题目1:将非负十进制整数n转换成b进制。(其中b=2~16)
算法设计思路:
递归:让输入的十进制数和所需要转化的几进制数输入递归体,再将每一步的运算结果储存起来,最终逆序输出,递归体为:x[m]=a%b; m++; f(a/b,b);递归出口:a<b。
非递归:利用%和/将数值一步步储存,之后逆序输出,在数组内部判断值是否大于9,大于9的话就会用大写字母输出。
栈结构:
第一次调用 第二次调用 ...
X[m]=123%2; x[m]=61%2; ...
m++; m++; ...
f (a=123,b=2) f(a=61,b=2) f(a=30,b=2) ...
部分执行过程
源程序:
递归:
package yuan;
import java.util.*;
import java.io.*;
public class di {
public static int m=0;
public static int[] x=new int[10];
public static int s;
public static void f(int a,int b) {
if(a>b) {
x[m]=a%b;
m++;
f(a/b,b);
}
if(a<b) {
x[m]=a;
m++;
System.out.println("输出的结果为:");
for(int j=m-1;j>=0;j--) {
if(x[j]<10) {
System.out.println(x[j]);
}
else if(x[j]==10) {
char y=(char) x[j];
y='A';
System.out.println(j);
}
else if(x[j]==11) {
char y=(char) x[j];
y='B';
System.out.println(y);
}
else if(x[j]==12) {
char y=(char) x[j];
y='C';
System.out.println(y);
}
else if(x[j]==13) {
char y=(char) x[j];
y='D';
System.out.println(y);
}
else if(x[j]==14) {
char y=(char) x[j];
y='F';
System.out.println(y);
}
else if(x[j]==15) {
char y=(char) x[j];
y='E';
System.out.println(y);
}
}
}
}
public static void main(String[] args) {
int a;
Scanner sc=new Scanner(System.in);
a=sc.nextInt();
System.out.println("请输入几进制:");
int b=sc.nextInt();
if(b>16||b<2) {
System.out.println("请重新输入转化的进制:");
b=sc.nextInt();}
f(a,b);
}
}
非递归:
package yuan;
import java.io.*;
import java.util.*;
public class s {
public static void main(String[] args) {
int a;
Scanner sc=new Scanner(System.in);
a=sc.nextInt();
System.out.println("请输入几进制:");
int b=sc.nextInt();
if(b>16||b<2) {
System.out.println("请重新输入转化的进制:");
b=sc.nextInt();}
int[] x=new int[8];
int i=0;
while(a!=0) {
x[i]=a%b;
i++;
a=a/b;
}
for(int j=i-1;j>=0;j--) {
if(x[j]<10) {
System.out.println(x[j]);
}
else if(x[j]==10) {
char y=(char) x[j];
y='A';
System.out.println(j);
}
else if(x[j]==11) {
char y=(char) x[j];
y='B';
System.out.println(y);
}
else if(x[j]==12) {
char y=(char) x[j];
y='C';
System.out.println(y);
}
else if(x[j]==13) {
char y=(char) x[j];
y='D';
System.out.println(y);
}
else if(x[j]==14) {
char y=(char) x[j];
y='F';
System.out.println(y);
}
else if(x[j]==15) {
char y=(char) x[j];
y='E';
System.out.println(y);
}
}
}
}
递归:
运行结果:
程序调试:
非递归:
程序调试:
个人总结:
本次程序的制作基于二进制的转化来完成,遇到的最大的问题在递归的条件使用,最开始时在递归使用过程前,将进入f()函数的a在前方改变以下为例子:
if(a>b) {
x[m]=a%b;
m++;
a=a/b;
f(a,b);
}
for(int j=m-1;j>=0;j--) {
System.out.println(x[j]);
}
这样在之后的逆序输出过程中造成了会输出两次值的情况。
在最开始的过程中,递归函数体的条件是(a!=0)在经过检验后,它会一直的输出值,完成不了递归调用的停止,而在非递归函数中它是可以实现的。Java中外部函数体的使用与c、c++使用不同,如果在主函数直接调用的话需要加上static关键字。
本次的程序可以简化过程的地方:
1、可以在最初实现一个数组将整个的1——15对应的值放入方便调用或是使用java自带的进制转换函数;
2、在输入部分可以将a,b直接输入,其余的部分可以省略;
3、本意实现String型与int型数值的自由转换,直接将每一次的int型数值转化为string并将其直接放入转换后的数值最前方的位置,这个功能在程序中没能体现。