Мне нужно сделать программу, которая считывает 2 ввода: 1-й содержит неотрицательное целое число n, не более 1 миллиарда (109), 2-й содержит неотрицательное целое число k (желаемая точность, измеренная дробными цифрами), не более 10 тысяч (104). Программа должна вывести одно число на стандартный вывод. Это число должно быть квадратным корнем из n, взятым с точностью до k дробных цифр, всегда округляясь в меньшую сторону всякий раз, когда требуется какое-то округление. (В случае, когда k = 0, результат следует округлить до ближайшего целого числа в меньшую сторону).
Это моя вторая задача, и я написал приведенный ниже код для ее расчета с использованием метода Ньютона.
Программа может свободно предположить, что входные данные будут соответствовать указанным выше условиям.
Программа работает, но количество десятичных разрядов не всегда правильное, чтобы решить эту проблему, я попытался добавить некоторое условие, чтобы увеличить getcontext().prec на одну единицу в соответствии с первым прочитанным числом. Но не решил проблему, так как для: - x ‹ 10 ^ 2 : результат правильный - x >= 10 ^ 2 & x ‹ 10 ^ 4: результат правильный unitl x = 3000, тогда десятичная позиция неверна для -1.
from decimal import *
from _decimal import Decimal
def sqrt(x):
last_guess = x/2.0
error = (1/(10**y))
while True:
guess = Decimal((last_guess + x/last_guess )/2)
if abs(Decimal(guess) - Decimal(last_guess)) < error: # example threshold
return Decimal(guess)
last_guess = Decimal(guess)
print(last_guess)
x = int(input("Calculate the square root of : "))
y = int(input("Decimal positions : "))
if x < 10**2:
getcontext().prec = y + 1
if x >= 10**2 and x < 10**4:
getcontext().prec = y + 2
if x >= 10**4 and x < 10**6:
getcontext().prec = y + 3
if x >= 10**6 and x < 10**8:
getcontext().prec = y + 4
if x >= 10**8 and x < 10**10:
getcontext().prec = y + 5
if x >= 10**10 and x < 10**12:
getcontext().prec = y + 6
if x >= 10**12 and x < 10**14:
getcontext().prec = y + 7
a =sqrt(x)
if x < 10**2:
getcontext().prec = y + 1
if x >= 10**2 and x < 10**4:
getcontext().prec = y + 2
if x >= 10**4 and x < 10**6:
getcontext().prec = y + 3
if x >= 10**6 and x < 10**8:
getcontext().prec = y + 4
if x >= 10**8 and x < 10**10:
getcontext().prec = y + 5
if x >= 10**10 and x < 10**12:
getcontext().prec = y + 6
if x >= 10**12 and x < 10**14:
getcontext().prec = y + 7
print("The square root of ",x," is : ", Decimal(a))
# print("The original number: ", Decimal(a)**2)
Для ввода
8765 8
ваша программа должна распечатать
93.62157870
Для ввода
3000 3
ваша программа должна распечатать
54,772
math.isqrt(n * 100**k)
уже дает вам все правильные цифры; нет необходимости в методе Ньютона. (Например,math.isqrt(8765 * 100**8)
дает9362157870
. Я оставляю вам решать, как напечатать это с десятичной точкой в нужном месте. - person Mark Dickinson   schedule 03.11.2019