Привет, я хочу написать код для поиска ближайшего квадратного числа, меньшего или равного определенному числу (x). Я пробовал следующее:

m = 0 
base = 0 
while m <= x:
   if m > x:
      break
   m = base**2
   base += 1

print(m) 

Это, однако, дает ближайший квадрат сразу после числа x, несмотря на то, что ставится разрыв, поскольку m> x уже присвоено m. как мне остановить цикл до m> x?

1
coolguy 14 Сен 2020 в 19:11

4 ответа

Лучший ответ

if m > x является избыточным. Тело цикла будет введено только в том случае, если m <= x имеет значение True, а если это True, m > x никогда не будет, так что break никогда не должен выполняться.

Чтобы ответить на ваш вопрос, не зная математики, я бы просто ввел вторую переменную prev_m, а затем использовал бы ее:

m = 0
prev_m = m
base = 0 
while m <= x:
    prev_m = m
    m = base**2
    base += 1

print(prev_m)  # Then use prev_m instead
3
Carcigenicate 14 Сен 2020 в 16:16

Есть более простой способ сделать это с помощью модуля math:

import math 
y = math.sqrt(x) #find the square root of x
if y.is_integer() == False: #check y is not a whole number
    print(math.pow(int(y),2)) # find the square root of the nearest whole number to y
0
Seyi Daniel 14 Сен 2020 в 16:28

Большинство ответов основаны на том, что на один квадрат больше, чем на предыдущий.
Но есть ли возможность узнать, будет ли следующий квадрат слишком большим, без его расчета ?

m = 0
base = -1
while base*2 + m < x:
    base += 1
    m = base**2

print(m)

Отказ от ответственности: просто забавный ответ, чтобы подумать, почему это работает.

0
Wups 14 Сен 2020 в 16:50

Просто запомните предыдущий m, прежде чем вычислять следующий.

m = 0 
base = 0 
last_m = 0
while m <= x:
   last_m = m
   m = base**2
   base += 1

print(last_m) 

Обратите внимание, что я вынул if и break, которые ничего не добавляли. Выражение в if никогда не будет true.

1
Steve 14 Сен 2020 в 16:18