ALGO25 / BLOG

Restul împărțirii numerelor negative în C++

Află de ce -7%3 este -1 în C++ și cum verifici paritatea. Separă restul limbajului de reprezentantul pozitiv folosit în aritmetica modulară.

În C++, -7/3 este -2, iar -7%3 este -1. Împărțirea întreagă elimină partea fracționară în direcția lui zero. Restul completează relația a=(a/b)·b+a%b; pentru exemplu, -7=(-2)·3+(-1).

Nu presupune un rest pozitiv

Operatorul % produce restul împărțirii întregi, nu automat un număr din intervalul 0..b-1. Pentru operanzi întregi și rezultat reprezentabil, un rest nenul are semnul lui a, deîmpărțitul. 7%-3 este 1, iar -7%-3 este -1.

Această regulă contează la indici circulari și la gruparea numerelor după rest. Dacă folosești direct un rest negativ ca indice într-un tablou, nu obții o poziție validă. Corectarea trebuie făcută înainte de acces, după ce ai stabilit că modulul este pozitiv.

Paritatea nu cere restul egal cu 1

Un număr întreg este par dacă restul la 2 este zero. Pentru a verifica dacă este impar, condiția generală este x%2!=0. Condiția x%2==1 pierde numerele impare negative, deoarece -3%2 este -1.

Testează -4,-3,0,3,4. Numerele impare sunt -3 și 3. Zero este par. Dacă enunțul admite numai numere naturale, o condiție mai restrânsă poate funcționa, dar nu o transfera fără verificare la un domeniu cu semn.

În C++17, -7/3 este -2 și -7%3 este -1. Relația -7=(-2)×3+(-1) păstrează legătura dintre cât și rest.În C++17, -7/3 este -2 și -7%3 este -1. Relația -7=(-2)×3+(-1) păstrează legătura dintre cât și rest.Mărește schema ↗

Cum obții un reprezentant între 0 și m-1

Pentru m pozitiv, calculezi mai întâi r=x%m. Dacă r este negativ, adaugi m o singură dată. Pentru x=-7 și m=3, r începe la -1 și devine 2. Numerele -7 și 2 diferă printr-un multiplu de 3, deci reprezintă aceeași clasă de resturi.

Forma condițională evită adăugarea inutilă a lui m când r era deja pozitiv. Formula folosită uneori, (x%m+m)%m, necesită și ea verificarea domeniului tipului pentru adunarea intermediară; nu este un motiv să ignori limitele numerice.

Două cazuri care nu sunt permise

Împărțirea sau restul la zero nu au rezultat valid. Mai există cazul în care câtul nu poate fi reprezentat în tipul rezultatului, cum se poate întâmpla la cea mai mică valoare negativă împărțită la -1. Programele trebuie să respecte limite care exclud aceste operații sau să le trateze explicit înainte.

Continuă cu operatorii aritmetici, divizibilitatea și calculele modulo. Pentru regula exactă, vezi împărțirea și restul în specificația C++.

Întrebări frecvente

Ce rezultat are -7 modulo 3 în C++?

Expresia -7 % 3 produce -1. Câtul întreg este -2, iar relația -7 = (-2)*3 + (-1) rămâne adevărată. Restul nenul are semnul deîmpărțitului.

Cum obțin un rest între 0 și m-1 pentru m pozitiv?

Calculează r = a % m, apoi adaugă m numai dacă r este negativ. Această formă evită adunarea inutilă a lui m atunci când restul este deja nenegativ.

Este permis operatorul modulo cu zero?

Nu. Divizorul trebuie să fie diferit de zero. Verifică și reprezentabilitatea câtului în cazurile extreme cu întregi cu semn; schimbarea semnului unui operand nu elimină limitele tipului.