实现韩信点兵的shell脚本效率

最近真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脚本效率

相关文章:

你感兴趣的文章:

标签云: