最近真TM没有时间写blog
突然看到网站有一个关于韩信点兵的问题,但是别人叫爱因斯坦阶梯问题,题目具体如下:
有一个长阶梯,每一步上2阶,最后剩1阶;若每一步上3阶;最后剩2阶;若每一步上5阶;最后剩4阶; 若每一步上6阶;最后剩5阶;只有每步上7阶,最后一阶也不剩。请问该阶梯至少有多少阶? (爱因斯坦阶梯问题)。
SHELL版本
写一个最基础的版本
NUM=3;while true ; do N2=`expr $NUM % 2` if [ $N2 == 1 ] ; then N3=`expr $NUM % 3` if [ $N3 == 2 ]; then N5=`expr $NUM % 5` if [ $N5 == 4 ]; then N6=`expr $NUM % 6` if [ $N6 == 5 ]; then N7=`expr $NUM % 7` if [ $N7 == 0 ]; then echo $NUM exit; else NUM=`expr $NUM + 1` continue fi else NUM=`expr $NUM + 1` continue fi else NUM=`expr $NUM + 1` continue fi else NUM=`expr $NUM + 1` continue fi else NUM=`expr $NUM + 1` continue fidone
优化第一步:使用 && 替代多个if判断
NUM=3;while true ; do if [ `expr $NUM % 2` == 1 ] && [ `expr $NUM % 3` == 2 ] && [ `expr $NUM % 5` == 4 ] && [ `expr $NUM % 6` == 5 ] && [ `expr $NUM % 7` == 0 ]; then echo $NUM break else NUM=`expr $NUM + 1` continue fidone
优化结果:
效果看上去简洁了效率没有任何提高第二步优化:使用shell自带的函数
NUM=3;while true ; do if [ $(($NUM%2)) == 1 ] && [ $(($NUM%3)) == 2 ] && [ $(($NUM%5)) == 4 ] && [ $(($NUM%6)) == 5 ] && [ $(($NUM%7)) == 0 ]; then echo $NUM break else NUM=`expr $NUM + 1` continue fidone
优化结果:
运行时间缩短了90%,牛逼,但是超越python版本还是有一点距离第三步优化:替换到后面的自增
NUM=3;while true ; do if [ $(($NUM%2)) == 1 ] && [ $(($NUM%3)) == 2 ] && [ $(($NUM%5)) == 4 ] && [ $(($NUM%6)) == 5 ] && [ $(($NUM%7)) == 0 ]; then echo $NUM break else NUM=$(($NUM + 1)) continue fidone
优化结果:
时间低于python的时间,哈哈哈哈哈,很好很强大Python版本
#!/usr/bin/env pythonn = 3while True: if (n%2 == 1) and (n%3 == 2) and (n%5 == 4) and (n%6 == 5) and (n%7 == 0): print n break else: n += 1 continue
原文地址:实现韩信点兵的shell脚本效率, 感谢原作者分享。 仿佛松树就是一位威风的将军,守护着国家的国民。