Input i modulo bardzo dużych liczb

Input i modulo bardzo dużych liczb
Spine
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 6964
0

Zadanko w systemie podobnym do SPOJ.
Obliczyć resztę z dzielenia pierwszej liczby przez drugą.

Mój kod:

Kopiuj
We = input().split(" ")
print (int(We[0]) % int(We[1]))

Testy dla małych liczb przechodzą. Testy dla dużych liczb przekraczają czas wykonania.
Jak to można przyspieszyć? Stawiam, że split i konwersja na int zżerają dużo czasu (przy liczbie rzędu 10^1000000).

W2
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 47
1

a testowałeś, np. tak

Kopiuj
reszta = divmod(10245888777, 666)
Spine
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 6964
0

@WWA2025: tak samo, dla testów "wymagających" przekroczenie czasu.

Kopiuj
We = input().split(" ")
print (divmod(int(We[0]), int(We[1]))[1])
W2
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 47
1

A może tak po bożemu bez tego split'a

Kopiuj
import math

str1 = int(input(f'Podaj cyfre/liczbe: '))
str2 = int(input(f'Podaj cyfre/liczbe: '))
r = math.fmod(str1 , str2)
print("Reszta : {}".format( r ) )
SI
  • Rejestracja: dni
  • Ostatnio: dni
1

A gdyby użyć szukania binarnego do ustalenia ile razy b mieści się w a, a potem już tylko odjąć?

Spine
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 6964
1
WWA2025 napisał(a):

A może tak po bożemu bez tego split'a

Bardzo bym tak chciał, ale dane wejściowe są oddzielone spacją, a nie enterem :(
input() nie działa tak jak cin >> x; w C++ :/
Skrypt musi być przygotowany tak, żeby działać w sprawdzarce na serwerze.


Modulo wykonywane tym algorytmem załatwiło sprawę: https://www.geeksforgeeks.org/how-to-compute-mod-of-a-big-number/
screenshot-20220115211654.png

Dzięki temu, nie konwertuję stringa na inta. Więc nawet jeśli w Pythonie modulo dużych intów jest tak samo optymalnie zaimplementowane, to zyskuję cenny czas, bo Python nie musi walidować długiego stringa z liczbą.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.