金蝉平方数(回溯+全排列+String字符串API)

/**
 *功能:求解3-9位数字的金蝉平方数,其中
 *金蝉平方数:整数A由1,2,3……,9这9个数字无重复的选取至少三个数字组 
 *成,它是一个平方数,经一次脱壳(即同时去其最高位与最低位)后剩下的是平方数,
 *再行脱壳后的数仍是平方数,依此类推,直至最后剩下的数(一位或二位)仍是平方数,
 *把这样的数A称为金蝉平方数。请编写程序,找出所有的金蝉平方数并显示在屏幕上。
 */

public class Jcpfs {
	/**
	 *金蝉平方数最多由9个数字组成
	 */
	static int c[] = new int [10]; 
	static boolean visit[] = new boolean[10];
	
	/**
	 *用回溯法枚举不重复n位数字的全排列
	 */
    static void dfs(int start, int n){
    	if(start == n+1){
    		g(f(n), f(n));
    		return;
    	}
    	for(int i = 1; i <= 9; i++){
    		if(!visit[i]){
    			visit[i] = true;
    		    c[start] = i;
    		    dfs(start+1, n);
    		    c[start] = 0;
    		    visit[i] = false;
    		}
    	}
    }
    
    /**
     * 得到数字num的位数,因为要判断小于等于2位就不再脱壳了
     */
    static int weiShu(int num){
         return String.valueOf(num).length();
    }
    
    /**
     * 将这个n位数字返回
     */
    static int f(int n){
    	int num = 0;
    	for(int i = 1; i <= n; i++){
    		num = num*10 + c[i];
    	}
    	return num;
    }
    
    /**
     * 如果数字num是平方数,则将它脱壳,当脱壳到最后如果是金蝉数字,则输出出来
     * 其中temp是暂存数字num用的,因此传参数时注意让他俩相等
     */
    static void g(int num, int numTemp){
    	//如果数字num不是平方数,则直接返回
    	if(!isPfs(num)){
    		return;
    	}
    	
    	//如果数字num是平方数,且脱壳到最后满足金蝉平方数定义,则输出出来
    	if(isPfs(num) && (weiShu(num) == 2 || weiShu(num) == 1)){
    		System.out.println(numTemp);
    		return;
    	}
    	else{      //如果仅仅是平方数,则进行脱壳
    	    String s = String.valueOf(num);
            int n = Integer.valueOf(s.substring(1, s.length()-1));
            g(n, numTemp);
    	}
    }
    
    /**
     * 判断一个数字n是否是平方数
     */
    static boolean isPfs(int n){
    	int  temp = (int) Math.sqrt(n);
    	if(temp*temp != n){
    		return false;
    	}	
    	return true;
    }
    
	/**
	 * 主函数
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		for(int i = 3; i <= 9; i++){
			dfs(1, i);
		}
	}
}

/*
196
841
1369
8649
38416
*/

你可能感兴趣的:(金蝉平方数(回溯+全排列+String字符串API))