Reaali Robootika.COM

NXT robotimaailm ja programmeerimine C-keeles

Informaatika olümpiaadi põhikooli eelvoor – Summa arvutamine

Põhikooli ja muidugi ka gümnaasiumi õpilased on ikka mega-targad. Informaatika olümpiaad tekkis sel aastal päevakorda ning siis mõtlesin, et proovin kõige lihtsamad ehk põhikooli ülesanded ära lahendada. No ausalt öeldes võttis mul ikka aega, et meelde tuletada mingeid lihtsaid matemaatika põhitõdesid ja alljärgnevale ülesandele lahendus kirjutada. Keeleks valisin puhta C, mis lisas omakorda veidi keerukust keele õppimise näol.

http://www.teaduskool.ut.ee/orb.aw/class=file/action=preview/id=6379/poh.et.pdf 

1. Summa - 0,5 sekundit - 20 punkti

Kirjutada programm, mis leiab antud täisarvude A ja B vahele jäävate täisarvude summa (A ja B ise kaasa arvatud).

Sisend. Tekstifaili summa.sis ainsal real on tühikuga eraldatud täisarvud A (−109 <= A <= 109) ja B (−109 <= B <= 109).

Väljund. Tekstifaili summa.val ainsale reale väljastada täisarv S — otsitav summa.

Näide. summa.sis

1 5

summa.val

15

Näide. summa.sis

3 2

summa.val

5

Hindamine. Testides summaarse väärtusega 10 punkti on liidetavate arv <= 10 000.


Lahenduse tegemisel võtsin aluseks Rao koodi ning täiendasin seda viisil, et tööle hakkaks.

Code Snippet
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4.   FILE *sisf;
  5.   FILE *valf;
  6.  
  7. int main(int argc, char *argv[])
  8. {
  9.   int  x, y, hoidja;
  10.   double summa;
  11.  
  12.   sisf = fopen( "summa.sis", "r" );
  13.   fscanf( sisf, "%i %i", &y, &x );
  14.  
  15.   printf("X on %i\n", x);
  16.   printf("Y on %i\n", y);
  17.   if(y > x)
  18.   {
  19.        hoidja = y;
  20.        y = x;
  21.        x = hoidja;
  22.   }
  23.  
  24.   for(summa = 0; y <= x; y++)
  25.     {
  26.            summa += y;
  27.     }
  28.  
  29.   printf("Summa on %.f\n", summa);
  30.   valf = fopen("summa.val", "w");      /* avame faili kirjutamiseks */
  31.    fprintf(valf, "%.f\n", summa);                           /* v?¤ljastame */
  32.    fclose(valf);                                        /* sulgeme faili */
  33.    return 0;
  34. }

Comments (2) -

  • Simmo

    12/27/2011 12:29:18 PM | Reply

    Osalesin ise ka põhikooli rühmas.
    Antud lahendus on küll suhteliselt lihtne, kuid ei pruugi teenida maksimumpunkte. Nimelt üks test sellel ülesandel oli "-1000000000 1000000000", mis tähendab seda, et programm jääb arve liitma pikemaks ajaks kui 0,5 sekundit (eriti veel testserveris, mis pole väga kaasaegne).
    Ise lahendasin maksimumpunktidele kasutades lihtsat valemit n*(n+1)/2, mis leiab arvude 1 kuni n summa. Selle valemi abil saab ka leida ülesandes vajalikku summat kui õigesti kasutada.

  • Leivo

    12/27/2011 1:32:00 PM | Reply

    Nende suurte numbrite korral 0,5 sekundi sisse ära ei mahu (algselt kirjeldatud variant), seepärast ongi vaja kasutada kindlat algoritmi ja peale seda pole programmi kirjutamine enam probleem.

Add comment

Loading