наибольшая сила входного числа до 500 - PullRequest
0 голосов
/ 05 сентября 2018

Я пытаюсь найти наибольшую степень входного числа, это меньше, чем 500, но мой код все еще не работает .. Что я делаю не так? Спасибо !!

n = int(input())
def function (n):
    x = 1
    y = n**x
    while y < 500:
        x += 1
        y = n**x
    return y
print function (n)

Ответы [ 6 ]

0 голосов
/ 07 сентября 2018

Более простой способ решить эту проблему - использовать логарифмы.

import math

def function(n):

    # If n is 500 then the solution to the equation is an integer and it will not be rounded down 
    # using the following code
    if n == 500:
        return 1

    # Find the solution to the equation and round down to find the largest integer power
    power = int(math.log(500) / math.log(n))
    return n**power
0 голосов
/ 06 сентября 2018

Четыре подхода: одностадийный, итеративный, другой итеративный, позволяющий избежать чрезмерного умножения, бинарный поиск для работы с очень большими пределами

import math

def maxpow(n, limit):
    return n**math.floor(math.log(limit) / math.log(n))

def maxpowit(n, limit):
    x = 1
    while (x * n < limit):
        x *= n
    return x

def maxpowit2(n, limit):
    x, y = 1, n
    while (y < limit):
        x, y = y, y * n
    return x

def maxpowbs(n, limit):
    stack = []
    x, y = 1, n
    while (y < limit):
        stack.append(y)
        x, y = y, y * y
    #here stack holds values n^(2^i)
    #like [2, 4, 16, 256, 65536, 4294967296]  
    for i in reversed(range(len(stack)-1)):
        y = stack[i]
        if (x * y < limit):
            x *= y
    return x


print(maxpow(2, 500), maxpowit(2, 500))
>>> 256 256

print(maxpowbs(2, 1152921504606846997))#2^60 + xxx
>>>1152921504606846976   #2^60 exactly
0 голосов
/ 05 сентября 2018

На самом деле вам не нужно использовать цикл while, поскольку мы можем с уверенностью согласиться, что выполнение цикла до 100 будет работать для всех чисел (кроме 1 как 1 ** 100000 = 1) как 2 ** 100 = 1267650600228229401496703205376

Вы не должны использовать function, поскольку есть встроенная функция с именем 'function'
Вы не должны начинать с x = 1, поскольку вы никогда не знаете, когда n будет 500 +

n = int(input())

def f(n):
    for x in range(100):
        if n ** x > 500:
            return n ** (x - 1)

print(f(n))

Если вы хотите, чтобы все n ** x меньше 500:

def f(n):
    arr = []

    for x in range(100):
        if n ** x < 500: arr.append(n ** x)
        else: break

    return arr

Или однострочник:

def f(n): return [n ** x for x in range(100) if n ** x < 500]

Надеюсь, это поможет!

0 голосов
/ 05 сентября 2018

Вы увеличиваете x в первую очередь. Попробуйте проверить значение после расчета с силой перед входом в цикл. Исправил ваш код. Добавлен код для обработки, если вы передаете 0 в качестве аргумента

n = int(input())

def function (n):
    x = 1
    if not n:
        return 0

    while  n**x < 500:
        y = n**x
        x += 1
    return y
print function (n)
0 голосов
/ 05 сентября 2018

сначала вычисляют временное значение y и возвращают предыдущее (действительное значение <500 <code>y), если новое значение выше 500:

def function (n):
    x = 1
    y = 0
    while True:
        x += 1
        temp_y = n**x
        if temp_y > 500:
            return y
        y = temp_y

Условие while True позволяет избежать вычисления y несколько раз. Если ничего не найдено, функция возвращает 0

Лучшее переписывание позволит избежать использования степенной функции и будет использовать ранее накопленный результат (с использованием целочисленного умножения вместо мощности с плавающей запятой, который может быть неточным, когда числа становятся большими)

def function (n):
    y = 0
    temp_y = n  # maybe start at 1 ?
    while True:
        temp_y *= n
        if temp_y > 500:
            return y
        y = temp_y

это избавляет от необходимости использовать x, более короткий и эффективный код.

0 голосов
/ 05 сентября 2018

Вы возвращаете результат, который перешел более 500, вы должны вычесть 1 из него, чтобы остаться ниже 500:

Исправлено:

n = int(input())
def function (n):
    x = 1
    y = n**x
    while y < 500:
        x += 1
        y = n**x

    # now we are over 500 - lets step back by 1  
    return n,x-1,n**(x-1)  # return a tuple of all numbers needed


number, power, result = function (n)
print("{} ** {} = {}".format(number,power,result))

Вывод на 5:

 5 ** 3 = 125
...