¿Hay alguna manera más fácil de lograr el siguiente código en C++ como Python?

for(long a = 1; a <= INT_MAX; a*=2)
    for(long b = a; b <= INT_MAX; b*=2)
        for(long c = b; c <= INT_MAX; c*=2)

Solo puedo reescribir como bucle while ya que Python parece no ser compatible.

Como

a = 1
while(a <= INT_MAX):
  b = a
  while(b <= INT_MAX):
    c = b
    while(c <= INT_MAX):
      c *= 2
    b *= 2
  a *= 2

Me cuesta leer esto y me pregunto si hay una mejor manera de lograrlo.

2
Coda Chang 30 sep. 2019 a las 08:08

3 respuestas

La mejor respuesta

Se lee mejor si se factoriza en un generador.

def geometric_range(start, end, step):
    n = start
    while n < end:
        yield n
        n *= step

for a in geometric_range(1, INT_MAX + 1, 2):
    for b in geometric_range(a, INT_MAX + 1, 2):
        for c in geometric_range(b, INT_MAX + 1, 2):
            pass # or whatever
4
Amadan 30 sep. 2019 a las 05:23

Podrá hacer lo siguiente en Python 3.8, utilizando las expresiones de asignación :

i = 1
while (i := i*2) < INT_MAX:
   ...
2
Selcuk 30 sep. 2019 a las 05:18

Para este código en particular, puede ser más obvio iterar sobre los bits:

INT_MAX = (1<<31) - 1

def highest_bit(x):
    return len(bin(x)) - 3

def bitfor(start, end=INT_MAX):
    start =  highest_bit(start)
    end = highest_bit(end) + 1   
    for i in range(start, end):
        yield 1 << i

for a in bitfor(1):
    for b in bitfor(a):
        for c in bitfor(b):
            pass
0
Jan Christoph Terasa 30 sep. 2019 a las 06:06
58161767