Метод умножения любого входного числа на следующее целое число - PullRequest
0 голосов
/ 20 октября 2019

Моя цель - взять любое рациональное число в качестве входных данных для функции и вывести следующее целое число, кратное входному числу. Есть ли способ определить рациональное выражение для любого такого числа? (т. е. 1,5 в качестве входа будет выводить 3)

Ответы [ 3 ]

1 голос
/ 20 октября 2019

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

from math import gcd
from decimal import Decimal

def whole_multiple(n):
    power = 10 ** -n.as_tuple().exponent
    n *= power
    return n // gcd(int(n), power)

, поэтому:

whole_multiple(Decimal('-4.4'))

возвращает:

-22

Обратите внимание, что вы должны передать в функцию объект decimal.Decimal, чтобы онрассчитать показатель степени и избежать ошибок аппроксимации с плавающей точкой.

0 голосов
/ 20 октября 2019

Вы можете попробовать это. Я не уверен, что ответ правильный !!! Но если это работает очень эффективное решение, я верю.

def nextMultiple(x):
    '''
        converting x to integer by multiplying by powers of 10
        eg: 1.5  as 15.0 = 1.5 * 10
        eg: 1.234 as  1234 = 1.234 * 1000
    '''
    m = len(str(x).split('.')[1])
    y = x * 10**(m)
    ans = y
    '''
        finding all prime factors of y and checking for condition to find the answer
    '''
    for i in range(2, int(y**0.5) + 1):
        if y % i == 0:
            c = round(i / x, m)
            if c == int(c) and i > x:
                ans = min(ans, i)
            o = y / i
            c = round(o / x, m)
            if c == int(c) and o > x:
                ans = min(ans, o)
    return ans

1.5 -> 3
3.13 -> 313.0
1.75 -> 7
10.1 -> 101.0
0 голосов
/ 20 октября 2019

Вы можете сделать это медленно и устойчиво, как это:

def find_multiple(num):
    new_num = num
    while True:                    # until you hit a break statement
        new_num = round(new_num + num, 3)   # add the original number to the current number (next multiple), round because floating points are weird
        if new_num.is_integer():   # check if that is a whole number
            print(new_num)         # if so print and break the loop
            break

Пример:

>>> def find_multiple(num):
...     new_num = num
...     while True:
...         new_num = round(new_num + num, 3)
...         if new_num.is_integer():
...             print(new_num)
...             break
... 
>>> find_multiple(1.5)
3.0
>>> find_multiple(1.9)
19.0
>>> find_multiple(45.123)
45123.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...