10进制转换为n进制的递归和非递归实现

题目:将非负十进制整数n转换成b进制。(其中b=2~16),1算法设计思路:这次的作业实现一个数的转换为n进制其中n<16,最关键的就是将这个数除以进制数,反复除,分别得出每步的余数和商,如果商大于进制数,递归重新处直到商小于进制数,如果等于进制数,有特殊处理,即加什么数在list 里是关键,最后将得到的每步余数倒序输出,得到的结果即为转换的进制数,采用java语言实现,用ArrayList 来保存每步得到的余数,遍历ArrayList得到结果。
2.递归模型:(1):递归头,即商小于等于进制数(m<=n)
(2)递归体,convertor(m/n,n,list),其中m为被除数,n为除数,list为数组容器。
3.转换为非递归模型:见Numberconvertor3
程序源代码:package 进制转换;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class NumConvertor {

public static void main(String[] args) {
	List list=new ArrayList();
     Scanner in=new Scanner(System.in);
     System.out.println("请输入你要转换的数和进制数");
     int a=in.nextInt();
     int b=in.nextInt();
     List arr=convertor(a, b, list);
     //System.out.println(arr);
     for(int i=arr.size()-1;i>-1;i--) {
    	 System.out.print(arr.get(i));
     }
}
public static List convertor(int m,int n,List list) {
	if(m==n) {
		list.add(0);
		list.add(m/n); return convertor(0,n,list);}
	else if(m>n) {
		list.add(m%n);
		return convertor(m/n,n,list);
	}
	
	else	
		list.add(m);
		return list ;
	
}

}
非递归实现:package 进制转换;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class NumConvertor3 {

public static void main(String[] args) {
	List list=new ArrayList();
     Scanner in=new Scanner(System.in);
     System.out.println("请输入你要转换的数和进制数");
     int a=in.nextInt();
     int b=in.nextInt();
    // List arr=convertor(a, b, list);
     boolean flag=true;
     while(flag) {
    	 if(a>b) {
    		 list.add(a%b);
    		 int temp;
    		 temp=a;
    		 a=a/b;
    		
    		 
    	 }
    	 else if(a==b) {
    		 list.add(0);
    		 list.add(a/b);
    		 flag=false;
    		 
    	 }
    	 else if(a<=b) {list.add(a);
    	   flag=false;
    	 }
    	 
     }
     
     
     
     
     
     
     
     //System.out.println(arr);
     for(int i=list.size()-1;i>-1;i--) {
    	 System.out.print(list.get(i));
     }
}}
题目二:任何一个正整数都可以用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)
   又如:
     1315=2^10 +2^8 +2^5 +2+2^0
所以1315最后可表示为:
   2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)
  输入:正整数(n≤20000)
输出:符合约定的n的0,2表示(在表示中不能有空格)
输入格式 Input Format
一个正整数
输出格式 Output Format
符合约定的n的0,2表示(在表示中不能有空格)
样例输入 Sample Input
73
样例输出 Sample Output
2(2(2)+2)+2(2+2(0))+2(0)

代码:package 进制转换;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class NumConvertor2 {

public static void main(String[] args) {
	List list=new ArrayList();
	List list2=new ArrayList();
     Scanner in=new Scanner(System.in);
     System.out.println("请输入你要转换的数和进制数");
     int a=in.nextInt();
     int b=in.nextInt();
     List arr=convertor(a, b, list);
     //System.out.println(arr);
     for(int i=arr.size()-1;i>-1;i--) {
    	
    	 if((int)arr.get(i)==1)
    		 
    	 list2.add(i);
    	 
     }
     StringBuilder c=new StringBuilder();
    // StringBuilder d=convertors( list2, c,list);
     for(int i=0;i<list2.size();i++) {
 		if((int)list2.get(i)>2)
 		{
 			
 				if((int)list2.get(i)==3)
 						c.append("2(2+2(0))");
 				if((int)list2.get(i)==4)
					c.append("2(2(2))");
 				if((int)list2.get(i)==5)
					c.append("2(2(2)+2(0))");
 				if((int)list2.get(i)==6)
					c.append("2(2(2)+2)");
 				if((int)list2.get(i)==7)
					c.append("2(2(2)+2+2(0))");
 				if((int)list2.get(i)==8)
					c.append("2(2(2)+2(2))");
 				if((int)list2.get(i)==9)
					c.append("2(2(2)+2(2)+2(1))");
 				if((int)list2.get(i)==10)
					c.append("-");
 				if((int)list2.get(i)==11)
					c.append("2(2(2)+2(2)+2+2(0))");
 				if((int)list2.get(i)==12)
					c.append("2(2(2)+2(2)+2(2))");
 				if((int)list2.get(i)==13)
					c.append("2(2(2)+2(2)+2(2)+2(0))");
 				if((int)list2.get(i)==14)
					c.append("2(2(2)+2(2)+2(2)+2)");
 				if((int)list2.get(i)==15)
					c.append("2(2(2)+2(2)+2(2)+2+2(0))");
 							}
 		else c.append("2"+"("+list2.get(i)+")");
     	c.append("+");
     }
 		
     c.setCharAt(c.length()-1, (char)0);
     
     System.out.println(c.toString());
     
}
public static List convertor(int m,int n,List list) {
	if(m==n) {
		list.add(0);
		list.add(m/n); return convertor(0,n,list);}
	else if(m>n) {
		list.add(m%n);
		return convertor(m/n,n,list);
	}
	
	else	
		list.add(m);
		return list ;
	
}}

题目一非递归截屏
题目一递归截屏
题目二截屏
总结:这次的递归作业我加深了对递归的认识和使用并递归以及递归向非递归的转换,关于题目二,我首先在题目一的基础上将一个数转换为二进制数,然后用ArrayList保存这个二进制数,在倒序遍历该数时,我记录下为1的数,比如2的10次方,那么这个10,就被加入到list2里面,在自己思考很久后还是没有想到怎么处理这个10,我就用列举的方式分解这个数那么10我就分解为2(2(2)+2(2)+2) ,用StringBuilder拼接字符串的方式来一步步加入这些结果,在最后拼接完成后在调用setCharAt()函数将最后一个+变为)这样就实现了题目就要求。

发布了6 篇原创文章 · 获赞 0 · 访问量 544
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览