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;
	}

}

  • 22
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 20
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值