【问题标题】:Writing a Python program that finds the square of a number without using multiplication or exponents?编写一个不使用乘法或指数求平方数的 Python 程序?
【发布时间】:2014-11-09 15:43:57
【问题描述】:

感谢您阅读并希望能回答我的问题。我一直在尝试编写这个 Python 程序,它可以在不使用乘法或指数的情况下找到数字的平方。相反,我必须得到从 1 开始的第一个奇数 n 个数字的总和。这就是我目前所拥有的:

def square():
    print("This program calculates the square of a given number")
    print("WITHOUT using multiplication! ")
    odd = 1
    n = eval(input("Enter a number: "))
    for odd in range(0, n + 1, 2):
        odd = odd + 2 
        final_square = n + odd
    print(n, "squared is", final_square, ".") 

编辑:大家好,我不能做 4 + 4 + 4 + 4。我必须做 1 + 3 + 5 + 7,我不知道怎么做。它给了我 4 平方是 11 什么的。

【问题讨论】:

  • 为什么不能给自己加一个数字...?
  • 在你的解决方案中使用 range() 吗?
  • 查看我的答案 - 我不知道你的循环是如何得到 11 的,因为你的循环实际上并没有生成前 n 个奇数 - 它正在生成一系列偶数。

标签: python for-loop perfect-square


【解决方案1】:

只是一些提示:

尽量不要使用eval(),它会评估任何给定的输入,因此它可以做一些你不想做的事情。请改用int()

请记住,比如说 4*4,它只是 4 + 4 + 4 + 4。你在 for 循环的正确轨道上,但现在让循环迭代 n 次,将 n 添加到自身。

new = 0
for _ in range(n):
    new += n

请注意,这不适用于负数。如果你要处理这些,也许在开头得到nabsolute 值:

def square(n):
    n = abs(n)
    ....

【讨论】:

    【解决方案2】:

    既然你被告知你必须通过产生前 n 个奇数来得到答案,那么你需要考虑如何做到这一点 - 当然你的循环没有这样做:

    几个问题:

    1. 你做odd = 1,然后在你的for循环中使用odd,两者不能共存,所以odd = 1的初始值被覆盖。
    2. 您的循环不会产生我能看到的前 n 个奇数。

    我的建议是重新设计你的循环:前“n”个奇数的形式是:

    1, 3, 5, ... n*2-1 (从 1 算起,而不是从 0 算起)

    这样的循环:

      final = 0 
      for c in range(1, n+1): #start counting from 1 to do 1 to n+1
          odd = c*2 -1        #Use the series above to generate each odd number.
          final += odd
    

    应该有效

    一个更“pythonic”的方法是:

     final = sum(c*2-1 for c in range(1,n))
    

    这使用生成器来创建所有奇数(相当于循环),并在创建时对这些值求和。

    【讨论】:

    • 如果这个答案有效 - 请勾选它以接受它:-)
    【解决方案3】:

    回到乘法的原始定义。

    只需将数字 n 添加到自身 n 次。什么这么难?它效率低下,但它会起作用。

    我相信还有一种更 Pythonic 的方式:

    def square(n):
       sum = 0
       for i in range(0,n):
          sum = sum + n
       return sum
    

    【讨论】:

    • 这个分配似乎不仅仅是为了找到 n2 的值,而是使用了前 n 个奇数之和等于 n2 的数学技巧。
    猜你喜欢
    • 2015-06-02
    • 2016-03-24
    • 2023-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多