用JAVA实现十进制转n进制

1. 题目

   将非负十进制整数n转换成b进制。(其中b=2~16)

2. 题目分析

   要将一个十进制转化为b进制,自然想到求二进制时的除二取余法,只要将2换为b即可。问题时怎样将这样的问题转化为递归模型。    经过数学归纳找到数学边界条件:n<b,如果n<b意味着不用接着往下求余数了。如何确定递归体,回想除二取余的过程,从下往上的读就能知道转化后的二进制,即确定了转化后的数。同理,转化为b进制时只需要从后到前的记下每一位上的数字即可。同时,若出现10-15之间的数字则用A,B,C,D,E,F表示。用字符串把最后求出来的接在字符串开始,最先求出来的部分接在后面。 递归模型。    经过分析,容易得到递归公式:

3. 递归栈表示

4. 代码:

递归:

package indi.zxp.jz;
import java.util.Scanner;
public class Binary_conversion {
          
   
	public static String binary(int n,int b) {
          
   
		if(n<b) {
          
   
			if(n<10)
				return String.valueOf(n);	
			else if(10==n)
				return "A";
			else if(11==n)
				return "B";
			else if(12==n)
				return "C";
			else if(13==n)
				return "D";
			else if(14==n)
				return "E";
			else 
				return "F";	
		}
		else {
          
   
			if((n%b)<10)
				return binary(n/b,b).concat(String.valueOf(n%b));
			if((n%b)==10)
				return binary(n/b,b).concat("A");
			else if((n%b)==11)
				return binary(n/b,b).concat("B");
			else if((n%b)==12)
				return binary(n/b,b).concat("C");
			else if((n%b)==13)
				return binary(n/b,b).concat("D");
			else if((n%b)==14)
				return binary(n/b,b).concat("E");
			else 
				return binary(n/b,b).concat("F");
		}
	}
	public static void main(String[] args) {
          
   
		Scanner sc=new Scanner(System.in);
		System.out.printf("请输入n的值:");
		int n=sc.nextInt();
		System.out.println("请输入要转换的进制(2-15)");
		System.out.println("提示:您需要输入一个正确的数字,若不正确,则重新输入!");
		int b;
		do {
          
   
			b=sc.nextInt();
		}while(b<=1||b>16);
		sc.close();
		System.out.printf(n+"的"+b+"进制为:"+binary(n,b));
	}
}

非递归

package snippet;
import java.util.LinkedList;
import java.util.Scanner;
public class bc {
          
   
	public static void binary(int n,int b) {
          
   
		LinkedList<String> bs=new LinkedList<String>();
		if(n<b) {
          
   
			if(n<10)
				bs.add(String.valueOf(n));
			else if(11==n)
				bs.add("A");
			else if(12==n)
				bs.add("B");
			else if(13==n)
				bs.add("C");
			else if(14==n)
				bs.add("D");
			else if(15==n)
				bs.add("E");
			else bs.add("F");
		}
			
		else {
          
   
			while(n>=b) {
          
   
				int a=n%b;
				if(a<10)
					bs.add(String.valueOf(a));
				else if(10==a)
					bs.add("A");
				else if(11==a)
					bs.add("B");
				else if(12==a)
					bs.add("C");
				else if(13==a)
					bs.add("D");
				else if(14==a)
					bs.add("E");
				else bs.add("F");
				n=n/b;
			}
			int c=n%b;
			if(c<10)
				bs.add(String.valueOf(c));
			else if(10==c)
				bs.add("A");
			else if(11==c)
				bs.add("B");
			else if(12==c)
				bs.add("C");
			else if(13==c)
				bs.add("D");
			else if(14==c)
				bs.add("E");
			else bs.add("F");
			//System.out.println(bs);
			LinkedList<String> cs=new LinkedList<String>();
			while(!bs.isEmpty()) {
          
   
				cs.add(bs.removeLast());
			}
			System.out.println(cs);
		}
	}
	public static void main(String []args) {
          
   
		Scanner sc=new Scanner(System.in);
		System.out.println("请输入n的值:");
		int n=sc.nextInt();
		System.out.println("请输入要转换的进制(2-15)");
		int b=sc.nextInt();
		sc.close();
		binary(n,b);
	}
}

5. 运行结果:

6. 总结

   使用Java语言,通过字符串连接函数将求出来的值进行连接,最终向调用该函数的主函数返回一个字符串形式的值。通过求递归边界和函数体再次练习使用递归,同时,用递归栈有助于理解递归模型。

经验分享 程序员 微信小程序 职场和发展