小史是一个应届生,虽然学的是电子专业,但是自己业余时间每天都会坚持学习编程、计算机、互联网等相关方面的知识,特别是算法的训练。
今天小史又在研究一道算法题了。
【学习现场】
小史今天学习了括号的配对与合法性。
括号配对就是指左括号和右括号要成对出现,并且括号之间是可以嵌套的。
比如:
()()是合法的括号串
())(是不合法的括号串,因为第三位的右括号没有左括号与之配对。
如果有3对括号,那么总共可以形成5个合法括号串,分别是:
()()()
(())()
((()))
()(())
(()())
那么如果有12对括号,总共能形成多少个合法的括号串呢?
题目:12对括号能组成多少合法括号串?
题目要求:请编程计算出结果,如果数字过大,给出它对100007取模之后的结果。
小史拿到题目后略微思考,很快有了思路,开始写代码了。读者们,你能比小史更快吗?
学习现场的玩法:
1)计算机编程解决题目,答案在公众号后台进行回复,回复格式为解答+答案,如答案为2,则回复解答2
2)回答正确后,会出现提示,同时有一个交流群的二维码,可进入“场粉交流群”,群内都是算法爱好者和互联网从业人士
3)注意,每道题都有有效期,有效期过后题目作废,只能等待下一道题了
4)学习现场是小史平时练习的题目,下一道题公布的时候,同时会公布上一道题小史的解法供大家参考,也欢迎大家将自己的解法进行留言
5)希望大家玩得开心
上期回顾:
小史解答:
1、直接算出20181124的阶乘是可以的,但是数太大了
2、阶乘末尾的0是由因数10组成的,出现一个因数10就会出现一个0
3、因数10是由因数2和因数5组成的,2x5=10
4、所以只要算从1乘到20181124有多少个因数2和因数5,由于因数2肯定比因数5多,所以只要算因数5的个数就行
5、每隔5个数就有一个因数5,每隔25个数会有一个包含两个因数5的数,以此类推
想明白了上述过程,最终的程序是非常简单的。
FactorialZeros.java
/**
* @author xiaoshi on 2018/11/24.
*/
public class FactorialZeros {
public int calc(int n) {
int result = 0;
// 一直除5,直到没有5为止
while(n / 5 > 0) {
// 将5的因子相加
result += n / 5;
// n迭代
n = n / 5;
}
return result;
}
}
(友情提示:可左右滑动)
Main.java
/**
* @author xiaoshi on 2018/11/24.
*/
public class Main {
public static void main(String[] args) {
FactorialZeros factorialZeros = new FactorialZeros();
System.out.println(factorialZeros.calc(20181124));
System.out.println(factorialZeros.calc(20181124) % 100007);
}
}
(友情提示:可左右滑动)
运行结果:
5045274
44924
学习现场是互联网侦察继面试现场后推出的一个姊妹现场,旨在帮助读者进行算法题的训练,同时提供学习交流群,希望对大家的学习和算法提高有所帮助。