ACM算法基础-第一节 枚举+优化套路(1)

平方十位数

        十位平方数0~9这10个数字不重复、不遗漏,可以组成很多10位数字。这其中也有很多恰好是平方数(是某个数的平方)。比如:1026753849,就是其中最小的一个平方数。请你找出其中最大的一个平方数是多少?

第一步 缩小范围

        找到最大平方数,我们可以换一个思路,找到这个数的平方根 。1026753849的平方根是32043,9876543210的平方根近似是99380,那么此时锁定查找范围 [ 32043, 99380] 。

第二步 判断是否是符合标准的十位数

       可以选择用set集合,判断是否为10位数,也可以用数组,查重。(个人觉得set集合更方便,不过我自己写的是使用数组,set集合是与别人对比时,觉得set可能更方便)

import java.math.BigInteger;

/**
* @author 作者: nuor
* @createDate 创建时间:2019年2月23日 上午8:12:47
*/
public class T1 {
	public static void main(String[] args) {
		int a = 98991;
		for (int i = a; i > 32043; i--) {
			BigInteger ai = BigInteger.valueOf(i);
			ai = ai.multiply(ai);
			String s = "" +ai;
			//System.out.println(s);
			int t = judge(s);
			if(t == 1) {
				System.out.println(""+ai);
				return;
			}
		}
	}
	static int judge(String str){      //  判断是否符合标准
		int a[] = new int[10];
		
		if(str.length() < 10) return 0;  // 表是不是
		for (int i = 0; i < 10; i++) {
			int t = str.charAt(i) - '0';
			if(a[t] == 1) 
				return 0;  // 重复表示不是
			a[t] = 1;
		}
		return 1;   // 表示无重复 是
	}
}

输出结果

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值