【问题标题】:Checking odd/even numbers and changing outputs on number size检查奇数/偶数并更改数字大小的输出
【发布时间】:2012-11-29 23:24:37
【问题描述】:

我有几个问题要解决,但有点卡住了。 问题是编写一个程序,让用户输入一个奇数(检查它是否为奇数),然后根据输入的大小打印一个倒置的星形金字塔。

比如你输入5,就出来了

*****
 ***
  *

因此,我的问题有两个方面。

1) 我如何检查它是偶数还是奇数?我试过if number/2 == int,希望它能做点什么,互联网告诉我做if number%2==0,但这不起作用。

2) 如何更改每行中间的星号?

非常感谢任何有关这两个问题的帮助。

【问题讨论】:

  • if number%2==0 是正确的方法,应该可以工作。关于第二个问题,请参阅:docs.python.org/2/library/string.html#format-examples
  • 什么不起作用?当它不起作用时,您应该发布您看到的错误消息——这将帮助我们找出可能出现的问题。
  • 要打印 5 个(或任何数量)星的链,请执行 print '*' * 5
  • @keirbtre 这告诉你你的number 是一个字符串......
  • @keirbtre:你明白为什么number%2==0 有效吗,甚至知道number%2 的含义是什么?如果不是,您可能从其他上下文中知道与mod 相同的操作。如果没有,您应该查找% 或“模”运算符,这样您实际上是在学习一些东西,而不仅仅是使用随机的互联网魔法。

标签: python numbers


【解决方案1】:

给你完整的答案根本没有意义,因为这是家庭作业,所以这里有几点建议:

偶数或奇数

number % 2 == 0

绝对是一个很好的方法来判断你的号码是否是偶数。

如果你不知道%,它会取模,这里是number 除以2 的余数。 http://en.wikipedia.org/wiki/Modulo_operation

打印金字塔

第一个建议:为了打印*****,你可以做print "*" * 5

第二个建议:为了使星号居中,您需要找出在星号之前要写多少个空格。然后你可以用print " "*1 + "*"*3打印一堆空格和星号

【讨论】:

  • 或者你可以让Python居中,例如:'{: ^6}'.format('*' * 3 )
  • @NullUserException 取决于口味 - 并且更清晰(恕我直言)('*' * 3).center(5)
  • 看起来都很棒!但这可能不是您刚开始学习 Python 时想到的第一个解决方案。 :-)
  • 回复。速度(见下面比尔 H 的回答和洛伦佐卡斯蒂略的评论),在“现代”机器上,模方法是 0.1198/0.1123 = 1.067 或大约快 7%。 IMO,模方法更具可读性,因此值得轻微的速度损失。
【解决方案2】:

这里的一些解决方案引用了各种“偶数”操作所花费的时间,特别是 n % 2n & 1,没有系统地检查这如何随 n 的大小而变化,结果证明这是预测性的速度。

简短的回答是,如果您使用大小合理的数字,normally < 1e9,它并没有太大的区别。如果您使用较大的数字,那么您可能希望使用按位运算符。

这是一个演示发生了什么的图(使用 Python 3.7.3,在 Linux 5.1.2 下):

基本上,当您点击“任意精度”时,模数会逐渐变慢,而按位运算则保持不变。另外,请注意 10**-7 乘数,即我每秒可以进行约 3000 万次(小整数)检查。

这是 Python 2.7.16 的相同情节:

它显示了新版本 Python 中的优化。

我的机器上只有这些版本的 Python,但如果有兴趣,可以重新运行其他版本。在 1 到 1e100 之间有 51 个ns(在对数刻度上均匀分布),对于每个点我都相当于:

timeit('n % 2', f'n={n}', number=niter) 

其中niter 被计算为使timeit 花费约0.1 秒,并且重复5 次。 n 的处理有点尴尬是为了确保我们不会同时对全局变量查找进行基准测试,这比局部变量慢。这些值的平均值用于绘制线,而各个值则绘制为点。

【讨论】:

  • 我不知道这是非常快
  • @SARose Python 仍然比优化/编译代码慢大约 30 倍,但现代 CPU 速度很快!
【解决方案3】:
if number%2==0

会告诉你它是偶数。所以奇数将是那里的 else 语句。 "%" 是除法后返回余数的 mod 符号。所以本质上我们说如果这个数字可以被 2 整除,我们可以安全地假设它是偶数。否则很奇怪(这是一个完美的相关性!)

至于星号位置,您希望在星号前面加上与其所在行相关的空格数。在你的例子中

***** line 0
***   line 1
*     line 2

我们需要相应的空间

0*****
01***
012*

【讨论】:

  • 感谢您的帮助,但老实说,考虑到我们几周前才开始学习编程,并且每周上 1 节课,我认为“努力学习”并不合适。跨度>
  • 我删除了评论,因为我肯定不是那种试图粗鲁的人。但这个问题不在于编程技能,而在于识别模式并应用它们。例如,可被 2 整除的 ho 数是偶数,而不是奇数。
  • 我坚持我的声明。这些都是简单的问题。我赞赏你在需要帮助时与专业人士交谈,这不是你应该回避的事情,但在这个级别上,你真的应该和你的老师、同学或导师交谈。结帐 codeschool.com 或购买 O'Reily 的书(节假日一直在销售)并通读。
【解决方案4】:
def main():
    n = float(input('odd:'))
    while n % 2 == 0:
        #if n % 2 == 1: No need for these lines as if it were true the while loop would not have been entered.
            #break not required as the while condition will break loop
        n = float(input('odd:'))


    for i in range(int((n+1)/2)):
        print(' '*i+'*'*int((n-2*i))+' '*i)

main()

#1st part ensures that it is an odd number that was entered.2nd part does the printing of triangular

【讨论】:

  • 你能解释一下为什么这段代码解决了 OP 的问题吗?
  • 第一部分确保输入的是奇数。第二部分打印三角形。
  • 请将其编辑到您的答案中
【解决方案5】:

简单但快速:

>>> def is_odd(a):
...     return bool(a - ((a>>1)<<1))
...
>>> print(is_odd(13))
True
>>> print(is_odd(12))
False
>>>

甚至更简单:

>>> def is_odd(a):
...   return bool(a & 1)

【讨论】:

    【解决方案6】:

    模数法是常用的方法。我们也可以这样做来检查奇数还是偶数:

    def f(a):
        if (a//2)*2 == a:
            return 'even'
        else:
            return 'odd'
    

    整数除以 2,然后乘以 2。

    【讨论】:

      【解决方案7】:

      1) 我如何检查它是偶数还是奇数?我尝试了“if number/2 == int”,希望它能做点什么,互联网告诉我做“if number%2==0”,但这不起作用。

      def isEven(number):
              return number % 2 == 0
      

      【讨论】:

      • @NullUserException 哇,我什至没有意识到我有那个.. :O 谢谢你指出/羞辱我。
      • 你只是重复了他所说的他已经尝试过的内容,if number%2==0,除了包装在一个函数中并且有更多的空格。这将如何解决他的问题?
      【解决方案8】:

      我想最简单最基本的方法是这样的

      import math
      
      number = int (input ('Enter number: '))
      
      if number % 2 == 0 and number != 0:
          print ('Even number')
      elif number == 0:
          print ('Zero is neither even, nor odd.')
      else:
          print ('Odd number')
      

      只是基本条件和数学。它还注意零,它既不是偶数也不是奇数,你可以通过输入给出你想要的任何数字,所以它非常可变。

      【讨论】:

      • 零是偶数。 0 = 0 x 2。
      【解决方案9】:

      具有 %2 的模 2 解决方案很好,但这需要除法和减法。因为计算机使用二进制算术,一个更有效的解决方案是:

      # This first solution does not produce a Boolean value. 
      is_odd_if_zero = value & 1
      
      # or
      
      is_odd = (value & 1) == 1
      
      # or
      
      is_even = (value & 1) == 0
      

      【讨论】:

      • 我查看了 timeit.Timer() 以了解这会产生多大的差异(如果有的话),并且在我的机器上存在(小于一个数量级)差异。运行 value = sys.maxsize, 1000000 次,你的方法和取模方法之间的差异大约是 0.07 秒,有利于你的方法。
      • 但还是很高兴知道,尤其是在处理大型数据集和对每个数据执行多个模运算时。此外,对于在旧的或缓慢的硬件架构上编程的人来说,很高兴知道。这就是我一直在寻找的答案。
      • 一个好的编译器应该知道value mod 2 == 0 应该评估为检查机器代码中的 LSB,不是吗?
      • @Jan:Python 没有编译器,也没有优化器。这会有所作为。
      • @endolith:Python 确实有一个优化器,但它没有通过常数优化余数(或除法)。然而,CPython 确实有一个快速的路径来计算“短”整数上的%,但不适用于位运算符。所以v%2 对于高达 30 位的整数(在 64 位系统上)比 v&amp;1 快,而对于更长的整数则慢。
      【解决方案10】:

      这是我的解决方案:

      def is_even(n):
          r=n/2.0
          return True if r==int(r) else False
      

      【讨论】:

        【解决方案11】:
        la = lambda x : "even" if not x % 2 else "odd"
        

        【讨论】:

        • 为什么我们需要否定部分? la = lambda x : "odd" if x % 2 else "even" 应该更短
        【解决方案12】:

        这是简单的代码。您可以尝试一下,轻松掌握知识。

        n = int(input('Enter integer : '))
            if n % 2 == 3`8huhubuiiujji`:
                print('digit entered is ODD')
            elif n % 2 == 0 and 2 < n < 5:
                print('EVEN AND in between [2,5]')
            elif n % 2 == 0 and 6 < n < 20:
                print('EVEN and in between [6,20]')
            elif n % 2 == 0 and n > 20:
               print('Even and greater than 20')
        

        等等……

        【讨论】:

          【解决方案13】:

          示例说明 给定一个整数n,执行以下条件操作:

          • 如果 n 是奇数,则打印 Weird
          • 如果 n 是偶数并且在 2 到 5 的范围内,则打印 Not Weird
          • 如果 n 是偶数并且在 6 到 20 的范围内,则打印 Weird
          • 如果 n 是偶数且大于 20,则打印 Not Weird
          import math
          n = int(input())
          
          if n % 2 ==1:
              print("Weird")
          elif n % 2==0 and n in range(2,6):
              print("Not Weird")
          elif n % 2 == 0 and n in range(6,21):
              print("Weird")
          elif n % 2==0 and n>20:
              print("Not Weird")
          

          【讨论】:

            【解决方案14】:

            关于打印输出,下面是我使用Format Specification Mini Language 的方法(部分:对齐文本并指定宽度):

            一旦你确定了长度,就说length = 11

            rowstring = '{{: ^{length:d}}}'.format(length = length) # center aligned, space-padded format string of length <length>
            for i in xrange(length, 0, -2): # iterate from top to bottom with step size 2
                print rowstring.format( '*' * i )
            

            【讨论】:

              【解决方案15】:

              有很多方法可以检查 int 值是奇数还是偶数。 我将向您展示两种主要方式:

              number = 5
              
              def best_way(number):
                  if number%2==0:
                      print "even"
                  else:
                      print "odd"
              
              def binary_way(number):
                  if str(bin(number))[len(bin(number))-1]=='0':
                      print "even"
                  else:
                      print "odd"
              best_way(number)
              binary_way(number)
              

              希望对你有帮助

              【讨论】:

                【解决方案16】:

                我的解决方案基本上我们有两个字符串,通过 & 我们得到正确的索引:

                res = ["Even", "Odd"]
                print(res[x & 1])
                

                请注意,它似乎比其他替代品慢:

                #!/usr/bin/env python3
                import math
                import random
                from timeit import timeit
                
                res = ["Even", "Odd"]
                
                def foo(x):
                    return res[x & 1]
                
                def bar(x):
                    if x & 1:
                        return "Odd"
                    return "Even"
                
                la = lambda x : "Even" if not x % 2 else "Odd"
                
                iter = 10000000
                
                time = timeit('bar(random.randint(1, 1000))', "from __main__ import bar, random", number=iter)
                print(time)
                time = timeit('la(random.randint(1, 1000))', "from __main__ import la, random", number=iter)
                print(time)
                time = timeit('foo(random.randint(1, 1000))', "from __main__ import foo, random", number=iter)
                print(time)
                

                输出:
                8.05739480999182
                8.170479692984372
                8.892275177990086

                【讨论】:

                  【解决方案17】:

                  1.另一个奇怪的测试功能

                  好的,作业是在 8 多年前提交的,但这里有另一种基于位移操作的解决方案:

                  def isodd(i):
                      return(bool(i>>0&1))
                  

                  测试给出:

                  >>> isodd(2)
                  False
                  >>> isodd(3)
                  True
                  >>> isodd(4)
                  False
                  

                  2。最近奇数替代方法

                  但是,与“给我这个精确的输入(一个整数奇数)否则我不会做任何事情”的代码不同,我还喜欢“给我一个数字,任何数字,以及我会给你一个离那个数字最近的金字塔”。

                  在这种情况下,此函数很有帮助,并为您提供最接近的奇数(例如,将 6

                  def nearodd(f):
                      return int(f/2)*2+1
                  

                  示例输出:

                  nearodd(4.9)
                  5
                  
                  nearodd(7.2)
                  7
                  
                  nearodd(8)
                  9  
                  

                  【讨论】:

                    【解决方案18】:

                    这个函数

                    def oddOrEven(num):
                        if num%2 == 0:
                            print("even")
                    
                        else: 
                            for i in range(num):
                                for j in range(i+1):
                                    print(" ", end="")
                                for m in range(num-i, 0, -1):
                                    print("* ", end="")
                                print()
                    

                    但是有一个问题,因为返回一个模式几乎是不可能的,所以我们必须打印而不是返回它,然后直接使用它oddOrEven(5) 将打印:

                     * * * * *
                      * * * *
                       * * *
                        * *
                         *
                    

                    【讨论】:

                      【解决方案19】:

                      确定偶数/奇数:

                      is_odd = num & 1
                      
                      is_even = (num & 1) == 0  # slowly: bitwise and number comparison 
                      is_even = (num & 1) is 0  # faster: bitwise and pointer comparsion
                      is_even = ~num & 1        # fastest: two bitwise operations
                      

                      使用is 比使用双等号比较快,但使用~ 求反更快。

                      【讨论】:

                        猜你喜欢
                        • 2016-04-21
                        • 2011-11-12
                        • 2018-11-22
                        • 2015-05-31
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 2018-07-23
                        相关资源
                        最近更新 更多