【问题标题】:Repeatedly check 2 different numbers to be equal to another number in python反复检查2个不同的数字是否等于python中的另一个数字
【发布时间】:2020-03-17 22:55:24
【问题描述】:

如果您导入一个大于或等于 0 的数字 (g),那么您应该能够将其写为: g = (2^m)*r ,(m > 0 并且 r 必须是奇数)。 我尝试了不同的方法并在网上搜索,但可以找到答案。 这是一个与 while/for 循环相关的问题,因为它与我研究中的那一章有关。

这是我迄今为止尝试过的事情之一:

g = int(input(' '))
m = 0
r = 1
while m >= 0:
        m += 1 
        if g == (2**m)*r:
                break
        else:
                r+=2
print(m)
print(r)

但我总是陷入无限循环......

如果有人能帮助我,我将不胜感激

【问题讨论】:

  • 因为你在同时增加gr
  • 听起来像是一道数学题。假设r 是偶数,那么你可以写r=2r'g = (2**(m+1))r'。事实上,这个等式涵盖了所有整数>1
  • 因此,接近它:采取g,只要它是偶数,就采取g' = d/2; m+=1。现在你只剩下奇怪的g'''' == r,你就完成了。
  • 我认为它属于math.stackexchange

标签: python for-loop math while-loop iteration


【解决方案1】:

鉴于 m 和 r 是整数,我不确定每个数字都可以表示为 (2**m) *r,因为 15 由 3,5 组成,并且这些因素都不是 2 的幂。[编辑我确实假设2 是 1+ 的幂,但如果它可以是 0 的幂,那就对了]

但是继续并假设您的输入是肯定可以表示为(2**m) *r 的数字,您需要在循环中修复一些事情以使其正常工作,您尝试遵循的解决方案是一种直截了当的蛮力一个但不完整,您需要尝试每个 m 的值和每个 r 的值,这不会发生在您的循环中,因此您可能会错过解决方案并在大多数情况下进入无限循环。

一个更完善的解决方案是首先考虑输入数字以得到它实际有多少个 2

import math
g = 5
m = 0
r = 1
while True:
    if(g % r == 0 and math.log2(g/r).is_integer()):
        m = math.log2(g/r)
        break
    r += 2

print(m)
print(r)

这里举个例子,我们以 12 将 12 除以 2 得到 6 它仍然是二分,所以我们继续,6/2 等于 3 3 不除以 2 所以我们结束循环,我们有 r = 3 和 m = 2 12 = 2**2 * 3 这是正确的。

这是你的解决方案

g = 3
m = 0
r = 1
while g != (2**m) * r:
    if g < (2**m) * r:
        m = -1
        r += 2
    m += 1

print(m)
print(r)

【讨论】:

  • 15 == (2**0) * 15.
  • 很好,我修复了蛮力方法,但我认为现在在大多数情况下我们有不止一种解决方案,如果没有标准,那么我想找到的任何解决方案都可以工作
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-14
  • 1970-01-01
  • 1970-01-01
  • 2013-02-10
  • 1970-01-01
  • 2017-01-09
相关资源
最近更新 更多