将非负十进制整数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并将其直接放入转换后的数值最前方的位置,这个功能在程序中没能体现。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值