暴力破解算法思想(1)

                                               暴力破解算法思想(1)

题目:美国数学家维纳(N.Wiener)智力早熟,11 岁就上了大学。他曾在 1935~1936 年应邀来中国清华大学讲学。一次,他参加某个重要会议,年轻的脸孔引人注目。于是 有人询问他的年龄,他回答说:“我年龄的立方是个 4 位数。我年龄的 4 次方是个 6 位数。这 10 个数字正好包含了从 0 到 9 这 10 个数字,每个都恰好出现 1 次。” 请你推算一下,他当时到底有多年轻。

 

拿到本题,咱们一般的想法是:

  1. 先按照一个可能的区间(比如1-100)。
  2. 然后在这个区间里面循环,求出每一个循环到的数的立方和四次方。
  3. 然后利用上面的条件(即它的立方以及四次方的位数是否满足条件,组成的10位数是否满足条件)进行筛选
  4. 得到那个准确的年龄

但是,在比赛中,我们的目的就是想出一个实用、快速、稳定、有效的方法去得到我们想要的结果,一道题你也许会想出很精妙的解决办法, 直接得到结果,但是耗时太长了,所以,在比赛的时候需要“灵活”一下,拿到这个题目后,我们肯定是不能很容易想出答案的,因为可能的情况太多,所以我们需要编程,利用所给条件,我们一定可以将可能的情况减少,在很少的可能结果中挑选一个正确的答案就变得容易得多,下面我们来看一看如何去写:

package violentCracking;

public class repeat {

	public static void main(String[] args) {
		// 运用重复检测的方法去做
		for (int i = 1; i < 100; i++) {
			int a =i*i*i;
			int b =a*i;
			if ((a+"").length()!=4) {//判断立方长度是否为4
				continue;
			}
			if ((b+"").length()!=6) {//判断4次方长度是否为6
				continue;
			}
			
			System.out.println("当前年龄"+i+"  年龄的三次方 "+a+" 年龄的四次方 "+b);
		}

	}

}

得到的结果是

当前年龄18  年龄的三次方 5832 年龄的四次方 104976
当前年龄19  年龄的三次方 6859 年龄的四次方 130321
当前年龄20  年龄的三次方 8000 年龄的四次方 160000
当前年龄21  年龄的三次方 9261 年龄的四次方 194481

从上面我们可以很清楚的看见哪一个年龄符合剩下的条件,即:这 10 个数字正好包含了从 0 到 9 这 10 个数字,每个都恰好出现 1 次。

相比之下我们运用第一种方法可能需要根据条件进行多次判断,虽然最后可以得出准确结果,但是去实现多次判断可能相对来说会更麻烦一些,后一种思路虽然得到的不是准确结果,但是我们一眼就能看出哪一个符合条件。

这个题目也许比较还不够明显,但是如果遇到条件更多的题目,两种方法的解题速度可能会相差很大,也就是说我们要巧用暴力破解:

  1. 找出相应可能的区间进行循环

  2. 利用部分套件进行筛选,选出可能的结果

  3. 如果可能的结果还是很多,那就再加一个判断条件

  4. 重复2、3步,直到能够人工很容易判断出符合条件的结果即可

以上是自己学习时候的简单整理分享,如有不对或者错误的地方,希望各位大佬指正,相互学习,谢谢。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值