Как изменить код, чтобы избежать ошибки переполнения при применении random.sample() ввода больших целых чисел?

#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)] выдает мне список, содержащий одно большое число.

Я также отмечаю, что:

  1. дистрибутивы, задействованные в вашем коде, по-видимому, позволяют вам дать хороший аналитический ответ за O(t) время
  2. возможно, вы также захотите улучшить свои проверки, чтобы остановить их выполнение навсегда, например, n,k,b = [2,2,2] кажется, что все ваши проверки проходят, но будут вращаться вечно
  3. использование for цикла было бы намного эффективнее рекурсии, учитывая, что Python не является «хвостовой рекурсией»