#python #random #input
#python #Случайный #ввод
Вопрос:
Программа показывает «OverflowError: Python int слишком большой для преобразования в C ssize_t» для ввода больших целых чисел (которые обязательны для проверки эффективности программы во всех граничных случаях).Как мне справиться с этой ошибкой?
import random
import sys
sys.setrecursionlimit(10**6)
t=int(input())
N =[]
K =[]
B =[]
while 1<=t<=20 :
n,k,b= input().split()
n,k,b = [int(n), int(k),int(b)]
t=t-1
N.append(n)
K.append(k)
B.append(b)
if b >= 1 and b <= (10**5) and n >= 1 and k <= (10**18) and b <= k :
i1=0
for val in K:
n=N[i1]
k=K[i1]
b=B[i1]
i1=i1 1
print('i entered for loop')
if sum(list(range(1, k 1))) >= n:
print(' i entered if loop')
def possibilities():
p = random.sample(range(1, k 1), b)
if sum(p) == n:
for i in range(0,b):
print(p[i],end=" ")
print("r")
else:
possibilities()
possibilities()
else:
print(-1)
Комментарии:
1. Используйте целочисленный тип C, который будет содержать до 10 ^ 18.
Ответ №1:
согласно документам, random.randrange
работает
в произвольно большом диапазоне
поэтому вместо того, чтобы делать:
p = random.sample(range(1, k 1), b)
вы могли бы сделать следующее:
p = [random.randrange(1, k 1) for _ in range(b)]
и заставить его работать для произвольно больших значений k
. обратите внимание, что когда k
значение меньше 2**63-1
(при условии, что вы используете 64-разрядную машину), использование sample
, вероятно, будет быстрее.
в качестве примера, где ваш код, по-видимому, терпел неудачу, random.sample(range(2**63), 1)
приводится
OverflowError: Python int слишком большой для преобразования в C ssize_t
while [random.randrange(2**63) for _ in range(10)]
выдает мне список, содержащий одно большое число.
Я также отмечаю, что:
- дистрибутивы, задействованные в вашем коде, по-видимому, позволяют вам дать хороший аналитический ответ за
O(t)
время - возможно, вы также захотите улучшить свои проверки, чтобы остановить их выполнение навсегда, например,
n,k,b = [2,2,2]
кажется, что все ваши проверки проходят, но будут вращаться вечно - использование
for
цикла было бы намного эффективнее рекурсии, учитывая, что Python не является «хвостовой рекурсией»