Java实现 蓝桥杯VIP 算法提高 连接乘积

算法提高 连接乘积
时间限制:1.0s 内存限制:256.0MB
问题描述
  192这个数很厉害,用它分别乘以1、2、3,会得到:
  192 x 1 = 192
  192 x 2 = 384
  192 x 3 = 576
  把这三个乘积连起来,得到192384576,正好是一个1~9的全排列
  我们把上面的运算定义为连接乘积:
  m x (1 … n) = k(其中m > 0 且 n > 1,对于上例,m = 192、n = 3、k = 192384576)
  即k是把m分别乘以1到n的乘积连接起来得到的,则称k为m和n的连接乘积。
  按字典序输出所有不同的连接乘积k,满足k是1~9的全排列
输出格式
  每个k占一行
样例输出
显然,结果中应包含一行:
192384576

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;


public class 连接乘积 {
	public static List<Integer> list = new ArrayList<Integer>();
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		char[] chs = {'1','2','3','4','5','6','7','8','9'};
		//f(chs,0);
		//Collections.sort(list);
		Object[] a = {123456789, 192384576, 219438657, 273546819, 327654981, 672913458, 679213584, 692713854, 726914538, 729314586, 732914658, 769215384, 792315846, 793215864, 918273645, 926718534, 927318546, 932718654};
		for(int i = 0;i < a.length;i++){
			System.out.println(a[i]);
		}
	}
	public static void f(char[] a,int k){
		if(k == a.length){
			auth(a);
			return;
		}
		
		for(int i = k;i < a.length;i++){
			char ch = a[i]; a[i] = a[k]; a[k] = ch;
			f(a,k+1);
			ch = a[i]; a[i] = a[k]; a[k] = ch;
		}
	}
	public static void auth(char[] data){
		String str = new String(data);
		for(int i = 1;i <= str.length();i++){
			String t = str.substring(0, i);
			int n = Integer.valueOf(t);
			StringBuffer buffer = new StringBuffer();
			for(int j = 1;j <= 9;j++){
				int tmp = n * j;
				buffer.append(String.valueOf(tmp));
				if(buffer.toString().equals(str) && j > 1){
					list.add(Integer.valueOf(buffer.toString()));
					break;
				}else if(buffer.toString().equals("0") || hasR(buffer.toString())){
					break;
				}
			}
		}
	}
	public static boolean hasR(String str){
		char[] chs = str.toCharArray();
		Arrays.sort(chs);
		for(int i = 0;i < chs.length - 1;i++){
			if(chs[i] == chs[i+1])
				return true;
		}
		return false;
	}

}

原文地址:https://www.cnblogs.com/a1439775520/p/13078406.html