实现韩信点兵的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
       fi
done

优化第一步:使用 && 替代多个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
       fi
done

优化结果:

  • 效果看上去简洁了
  • 效率没有任何提高

第二步优化:使用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
       fi
done

优化结果:

  • 运行时间缩短了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
       fi
done

优化结果:

  • 时间低于python的时间,哈哈哈哈哈,很好很强大

Python版本

#!/usr/bin/env python
n = 3
while 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
分类:linux应用 时间:2015-05-03 人气:30
本文关键词: python shell
分享到:

相关文章

iOS 开发

Android 开发

Python 开发

JAVA 开发

开发语言

PHP 开发

Ruby 开发

搜索

前端开发

数据库

开发工具

开放平台

Javascript 开发

.NET 开发

云计算

服务器

Copyright (C) codeweblog.com, All Rights Reserved.

CodeWeblog.com 版权所有 闽ICP备15018612号

processed in 0.037 (s). 10 q(s)