Cum să gestionați diviziunea numerelor mari în Python? (Programare, Python, Virgulă Mobilă, Număr Întreg, Divizia)

Ambidextru a intrebat.

Am un număr de 100 de cifre și încerc să pun toate cifrele numărului într-o listă, astfel încât să pot efectua operații asupra lor. Pentru a face acest lucru, folosesc următorul cod:

for x in range (0, 1000):
   list[x] = number % 10
   number = number / 10

Dar problema cu care mă confrunt este că primesc o eroare de depășire ceva de genul număr prea mare float/întreg. Am încercat chiar să folosesc următoarea alternativă

number = int (number / 10)

Cum pot să împart acest număr uriaș cu rezultatul înapoi în tipul întreg, adică fără float?

4 răspunsuri
Alex Riley

În Python 3, number / 10 va încerca să returneze un float. Cu toate acestea, valorile în virgulă mobilă nu pot fi de dimensiuni arbitrar de mari în Python și dacă number este mare un OverflowError va fi ridicată.

Puteți afla valoarea maximă pe care o pot lua valorile cu virgulă mobilă din Python pe sistemul dumneavoastră folosind funcția sys modul:

>>> import sys
>>> sys.float_info.max
1.7976931348623157e+308

Pentru a ocoli această limitare, utilizați în schimb // pentru a obține un număr întreg în urma împărțirii celor două numere întregi:

number // 10

Acest lucru va returna valoarea int valoarea minimă a number / 10 (nu produce un float). Spre deosebire de float, int valorile pot fi atât de mari cât aveți nevoie în Python 3 (în limitele memoriei).

Acum puteți împărți numerele mari. De exemplu, în Python 3:

>>> 2**3000 / 10
OverflowError: integer division result too large for a float

>>> 2**3000 // 10
123023192216111717693155881327...

Comentarii

  • Dar funcționează acest lucru și la long int? Presupun că, în cazul unui număr mare, python îl va alege automat ca long it? –  > Por Ambidextru.
  • În Python 3 nu există long tip (numerele întregi pot avea orice dimensiune). Funcționează în Python 2 cu ambele tipuri. –  > Por Alex Riley.
  • Minunat. Nu am știut despre // diviziune înainte. –  > Por Mudit Jain.
  • Cu grijă. Doar pentru că nu primești un OverflowError nu înseamnă că împărțirea este corectă. stackoverflow.com/questions/26740938/… – –  > Por Maxpm.
  • @Maxpm: asta este adevărat pentru diviziunea adevărată (/), unde obțineți înapoi un float, dar pentru numere întregi a și b poți fi sigur că împărțirea întregi a // b este corectă, indiferent de mărimea numărului întreg rezultat. –  > Por Alex Riley.
fredtantini

Dacă aveți un număr întreg și doriți fiecare cifră într-o listă, puteți folosi:

>>> map(int,list(str(number)))
[1, 5, 0, 3, 0, 0, 7, 6, 4, 2, 2, 6, 8, 3, 9, 7, 5, 0, 3, 6, 6, 4, 0, 5, 1, 2, 4, 3, 7, 8, 2, 5, 2, 4, 4, 5, 4, 8, 4, 0, 6, 6, 4, 5, 0, 9, 2, 4, 8, 9, 2, 9, 7, 8, 7, 3, 9, 9, 9, 7, 0, 1, 7, 4, 8, 2, 4, 4, 2, 9, 6, 9, 5, 1, 7, 1, 3, 4, 8, 5, 1, 3, 3, 1, 7, 9, 0, 1, 0, 1, 9, 3, 8, 4, 2, 0, 1, 9, 2, 9]

transformă int-ul într-un șir de caractere, apoi list va lua fiecare caracter din șir și îl va pune într-o listă. În cele din urmă, map va transforma din nou fiecare element din listă într-un int.

ZekeDroid

Python se va ocupa în mod automat de fișierele mari ints de lungime arbitrară. Ceea ce nu va face este să se ocupe de floats de lungime arbitrară, așa că trebuie să vă asigurați că nu primiți flote pe parcurs.

Comentarii

  • adevărat. Dar, cum pot evita acest lucru în cazul în care împart numărul. Există vreo funcție care să se ocupe de acest lucru. –  > Por Ambidextră.
  • da, așa cum am menționat anterior, utilizarea operatorului // vă va ajuta să vă asigurați că răspunsul dvs. este întotdeauna un int. –  > Por ZekeDroid.
erip

Încercați int(number) % 10. Poți modela doar numere întregi.

Comentarii

  • Numărul este deja întreg și funcționează. Problema apare în cazul împărțirii. Când încerc să îl împart la 10, vreau doar numărul întreg rămas. Dacă folosesc int(număr/10), primesc eroarea „număr prea mare pentru float”. –  > Por Ambidextru.
  • Este interesant, deoarece x mod 10 ar trebui să se afle în subsetul [0, 9]; astfel, împărțirea la 10 ar fi 0 prin împărțire la numere întregi. –  > Por erip.
  • Așteptați, python’s / nu este o diviziune de numere întregi. // este calea de urmat. –  > Por erip.