南大高级算法作业之数字重组整除问题

input:

3

17

15

16

output:

17

51

Not Possible

  先利用递归求出全排列,然后对全排列进行转为字符串操作,判断是否被17整除以及是否比上一个result值大,最后得到最大的值,有一个细节是每次存放结果时,如果用int类型的result就不可以,可能是每次调用递归都会重新初始化result,想改的话设置为全局变量就行,也没有必要有返回值,反正代码可改进空间很大。

代码:

import java.util.*;

public class Main
{		
	public static int[] rearrange(String str[],int pos,int result[]){
		
		//arrage finish
		if(pos == str.length-1){
			
			StringBuffer sb = new StringBuffer();

			for(int i = 0; i < str.length;i++){

			  sb.append(str[i]);

			}

			String s = sb.toString();
			
			if(Integer.parseInt(s)%17 == 0 && Integer.parseInt(s) > result[0]){
				
				result[0] = Integer.parseInt(s);
				
			}
			
		}else{
			
			//include self	
			for(int i=pos;i < str.length;i ++){
				
				//swap
				String temp = str[pos];
				
				str[pos] = str[i];
				
				str[i] = temp;
				
				rearrange(str,pos+1,result);
				
				str[i] = str[pos];
				
				str[pos] = temp;
				
			}
					
			
		}
		
		return result;
		
	}
	
	public static void main (String[] args){
		
		Scanner scan = new Scanner(System.in);
	
		int e_num = Integer.parseInt(scan.nextLine());
    	
			while(e_num > 0){
				
				String[] str = scan.nextLine().split("");
				
				int[] result = new int[1];
				
				result[0] = 0;
				
				result = rearrange(str,0,result);
						
				if(result[0] == 0){
					
					System.out.println("Not Possible");
					
				}else{
				
					System.out.println(result[0]);
					
				}
    			e_num --;
	
			}
	}
       
}

 

你可能感兴趣的:(南大高级算法作业之数字重组整除问题)