蓝桥杯 ADV-189 连接乘积 java

问题描述

问题描述
  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

参考代码

package 连接乘积;


public class Exam {
	//使用回溯枚举出所有全排列字串
	static int[] arr = {1,2,3,4,5,6,7,8,9};
	static boolean[] check = new boolean[9];
	static StringBuilder sb = new StringBuilder();
	public static void main(String[] args) {
	f(0);
}
	private static void f(int len) {
		if (len == 9) {
			//是全排列,进行验证是否满足链接乘积
			if (auth(sb.toString())) {
				System.out.println(sb);
			};
		}else {
			for (int i = 0; i < arr.length; i++) {
				if (!check[i]) {
					sb.append(arr[i]);
					check[i] = true;
					f(len+1);
					sb.deleteCharAt(sb.length()-1);
					check[i] = false;
				}
			}
		}
	}
	private static boolean auth(String string) {
		//遍历数字m
		for (int i = 1; i <= string.length(); i++) {
			String subStr = string.substring(0,i);
			int num = Integer.parseInt(subStr);
			//用来存储结果相连的字串
			StringBuilder builder = new StringBuilder();
			for (int n = 1; n < 10; n++) {
				int result = num*n;
				builder.append(result);//192384576
				//结果相连长度超过9是错误的
				if (builder.length() > 9)break;
				//结果相连包括0是错误的
				if (builder.indexOf("0") != -1)break;
				
				//结果相连与原全排列字符串相同是正确的的
				if (builder.toString().equals(string) && n >1) {
					return true;
					
				}
			}
		}
		return false;
	}
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一条小传传

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值