自学算法之爱因斯坦的台阶

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_37014990/article/details/79945077

且看题目:

有一个长阶梯,若每步上2阶,最后剩下1阶,若每步上3阶,最后剩下2阶,若每步上5阶,最后剩下4阶,若每步上6阶,最后剩下5阶,只有每步上7阶,最后刚好一阶也不剩下。

讲道理,笔者刚看到该题目的时候,一脸懵逼,完全不会做。但是,仔细一想,这题完全就是一道数学题,即:

设总台阶数为N,同时满足以下表达式的N值,便是总台阶数:

n = 1(mod 2)

n = 2(mod 3)

n = 4(mod 5)

n = 5(mod 6)

n = 0(mod 7)

表达式一出来,代码就好撸了:

	public static int countNum(){
		int n = 1; //记录台阶数
		while(!(n % 2 == 1 && n % 3 == 2 && n % 5 == 4 && n % 6 == 5 && n % 7 == 0)){
			n++;
		}
		return n;
	}

当然,代码跑出来的结果为119,结果是正确的。

但是.....这段代码加法,就执行了119次,没错,就是如此暴力。

那么,我们稍微想想,最后一个表达式:n = 0(mod 7),讲道理,台阶数肯定是7的倍数......然而,当时读者根本就看不出来,结构,被熟人嘲讽了一阵.....

且看,代码:

	public static int countNum(){
		int n = 7; //记录台阶数,从7开始
		while(!(n % 2 == 1 && n % 3 == 2 && n % 5 == 4 && n % 6 == 5 && n % 7 == 0)){
			n = n + 7; //增加步长7
		}
		return n;
	}

该程序,不知道做了几次加法,但总比一个个的加上去的好。









猜你喜欢

转载自blog.csdn.net/qq_37014990/article/details/79945077