这篇文章讲述的是算法初级部分的整数进制转换问题的java实现,参考的书籍为清华大学出版社出版,贾蓓等编著的《c语言趣味编程1000例》,如有错误或者不当之处,还望各位大神批评指正。
问题描述
给定一个M进制的数x,实现对x向任意进制的数的转换。
算法分析
进制转换的基本思想是对进制M取余,再逆向输出余数,过程如下例:
将10进制的8转换成2进制
第一步: 8%2 = 0 , 8/2 = 4
第二步: 4%2 = 0 , 4/2 = 2
第三步: 2%2 = 0 , 2/2 = 1
第五步: 1%2 = 1 , 1/2 = 0
第六步:逆序输出余数:1 0 0 0 即为8的2进制表示
考虑要求的特性,先进后出,需要借助栈这个数据结构来完成。
代码实现
public class Q10_NumberConvert {
/**
* 问题分析:给定一个M进制的数x,实现对x向任意进制的数的转换。
*
* 算法分析:进制转换的基本思想是对进制M取余,再逆向输出余数,过程如下例:
* 将10进制的8转换成2进制
* 第一步: 8%2 = 0 , 8/2 = 4
* 第二步: 4%2 = 0 , 4/2 = 2
* 第三步: 2%2 = 0 , 2/2 = 1
* 第五步: 1%2 = 1 , 1/2 = 0
* 第六步:逆序输出余数:1 0 0 0 即为8的2进制表示
*
* 考虑要求的特性,先进后出,需要借助栈这个数据结构来完成。
*/
public static void main(String[] args) {
final int N = 16 ; //输出数据的进制
final int number = 1000 ;
Stack stack = new Stack() ; //初始化一个栈
stack.init();
int n = number ;
while(n > 0){
switch(n % N){
case 10: stack.push('A');break;
case 11: stack.push('B');break;
case 12: stack.push('C');break;
case 13: stack.push('D');break;
case 14: stack.push('E');break;
case 15: stack.push('F');break;
default:{
stack.push(n%N);
}
}
n /= N ;
}
System.out.print("整数 "+number+" 的 "+N+" 进制转换后的结果为:");
while(stack.size()>0){
System.out.print(stack.pop()+" ");
}
}
}
/*链栈的java实现*/
class Stack{
/*定义两个指针目的是分别指向栈底和栈顶*/
private Element base ;
private Element top ;
/*栈中的数据模型*/
class Element{
public Object data ; //栈中元素
Element next ; //下一个元素
}
/*初始化*/
public void init(){
Element elem = new Element() ; //开辟一个元素的空间作为栈底
base = elem ; //top指针和base指针初始化
top = elem ;
base.data = null ;
//System.out.println("栈已初始化");
}
/*压栈操作*/
public void push(Object obj){
Element elem = new Element() ; // 入栈元素分配空间
elem.data = obj ; // 将元素放入
elem.next = top ; // 元素指针指向当前top所指元素
top = elem ; // 修改top指针
//System.out.println(top.data+" 压栈成功");
}
/*退栈操作*/
public Object pop(){
if(this.isEmpty()){
System.out.println("退栈失败,栈为空!");
return null ;
}
Object obj = top.data ; //取出对象的值
top = top.next ; //修改top指针
//System.out.println(obj+" 退栈成功");
return obj ; //返回元素
}
/*判断栈是否为空*/
public boolean isEmpty(){
if(base == top) //若栈顶栈底指针相同,则为空否则非空
return true ;
else
return false ;
}
/*清空栈*/
public void clear(){
while(!this.isEmpty()){
this.pop() ;
}
System.out.println("栈已清空");
}
/*获取栈的大小*/
public int size(){
int n = 0 ;
Element flag = top ;
while(flag!=base){
flag = flag.next ;
n++ ;
}
return n ;
}
/*遍历栈,输出栈的元素*/
public void print(){
if(this.isEmpty()){ //若栈空
System.out.println("输出失败,栈为空!");
}else{
Element flag = top ;
System.out.print("栈中元素为:");
while(flag != base){
System.out.print(flag.data+" ");
flag = flag.next ;
}
}
}
}
递归方法实现
/*递归法实现*/
public static void sort(int num , int format){
if(num == 0){
return ;
}else{
sort(num/format , format) ;
switch( num%format ){
case 10 : System.out.print('A'+" ");break ;
case 11 : System.out.print('B'+" ");break ;
case 12 : System.out.print('C'+" ");break ;
case 13 : System.out.print('D'+" ");break ;
case 14 : System.out.print('E'+" ");break ;
case 15 : System.out.print('F'+" ");break ;
default:{
System.out.print(num%format+" ");
}
}
}
}
样例输出
整数 1000 的 16 进制转换后的结果为:3 E 8