Problem sa ocenjivanjem rešenja

Pozdrav,

Radi se o zadatku Trotoar iz prve runde kvalifikacija iz 2017. godine:

Program sam pisao u Pascalu. Kada pošaljem zadatak na proveru, dobijem informaciju za je za neke test primere rešenje tačno, a za neke nije.


Prvi netačan test primer je sa brojem 5. Ulazne vrednosti su 99 98 99. Tačan rezultat je zbir ovih brojeva, odnosno 296.
Međutim, ako ja u mom programu zadam ove vrednosti, dobijem 296 kao rezultat, tako da ne znam zbog čega je ocenjeno kao netačno.
Izvorni kod za program je

program z2017_k1_1;

var
  ia,ib,ic,r,rmin : Integer;
begin
  ReadLn(ia,ib,ic);
  rmin:=ia+ib+ic;
  r:=ia+ib*ic;
  if r<rmin then rmin:=r;
  r:=ia*ib+ic;
  if r<rmin then rmin:=r;
  r:=ia*ib*ic;
  if r<rmin then rmin:=r;
  WriteLn(rmin);
  ReadLn;
end.

I za još nekoliko test-primera ja lokalno dobijem tačno rešenje, a sistem oceni kao pogrešno.
Zbog čega se ovo javlja? Da li ja grešim ili postoji neka greška u sistemu za ocenjivanje?

Pozdrav,
Nenad

Problem je u maksimalnoj mogucoj vredonsti koju tip Integer podrzava. Ako je program kompajliran koristeci Free Pascal, ove promenljive su predstavljene sa 16 bita, i time ogranicene na interval [-2^{15}, 2^{15}-1]. Ako se rezultat operacije nalazi van ovog intervala, dolazi do “overflow-a” i vrednost se prebacuje na drugi kraj opsega – na primer, 32767 + 100 = -32699.

U primerima koji ti ne prolaze, ovo se desava kada se sve tri vrednosti pomnoze (jer 99 \cdot 98 \cdot 99 = 960498 > 32767), i rezultat ovog mnozenja je negativan i kao takav najmanji kandidat za rmin. Resenje je zameniti tip Integer nekim od vecih tipova, na primer 32-bitnim Longint ili 64-bitnim Int64 – za vise detalja mozes pogledati ovde.

Na tvom racunaru program verovatno radi ispravno jer koristis drugi kompajler, koji Integer definise kao 32-bitni tip u koji “staju” sve vrednosti koje se izracunaju.

1 Like

U pravu ste, svaka čast!
Nisam ranije koristio Free Pascal, pa mi nije palo na pamet da Integer može da bude 16-bitni.

Pozdrav,
Nenad