ZADACI SA BROJEVIMA
Izračunavanje faktorijela
Načiniti potprogram tipa FUNCTION za izračunavanje faktorijela nenegativnog celog broja (n!). U glavnom programu učitati i štampati broj n, pozvati gornji potprogram i štampati dobijeni rezultat. Posebni podaci: n = 7, 12, 100. REŠENJE: Funkcija n! se definiše kao proizvod prirodnog broja n sa svim prirodnim brojevima koji mu prethode: n! = n x (n-1) x (n-2). . . x 2 x 1, n>1 (n e N), uz pridruživanje 0! = 1. Programsko rešenje u PDL-u bi moglo da ima sledeći izgled: begin read (x); i:=1; y:=1; do while (i<=x) y:=y*x; i:=i+1 end do; write(x, '!=', y) end 1.Rešenje ************************************************************************ * Izračunavanje faktorijela - n! * (prvo rešenje) ************************************************************************ * * N - argument * NF - rezultat * PROGRAM NFAKT1 * OPEN(3, FILE='NFAKT1.R') * PRINT *, ' UNESITE N' READ *, N IF(N .LT.0) STOP * WRITE(3, *)' FAKTORIJEL ' WRITE(3, '(/, 6H N = , I4)') N
* NF=NFAKT(N) * WRITE(3, '(A, I7, /)') ' N! = ', NF * CLOSE(3) * END FUNCTION NFAKT(N) * NFAKT=1 DO WHILE(N .GT.1) NFAKT=NFAKT*N N=N-1 END DO * END Rezultat: FAKTORIJEL N = 7 N! = 5040 Zapažanje broj 1: U navedenom rešenju korišćena je unutrašnja konvencija FORTRAN-a, prema kojoj su sve promenljive čija imena počinju slovima: I, J, K, L, M i N tipa INTEGER (a ostale tipa REAL). Zapažanje broj 2: Poznato je da se u slučaju obične INTEGER aritmetike, u Advanced FORTRAN-u, zauzimaju dve 16-to bitne reči, a koristi samo jedna (dok se u slučaju INTEGER*2 aritmetike zauzima i koristi samo jedna 16-to bitna reč, a u slučaju INTEGER*4 aritmetike zauzimaju se i koriste dve 16-to bitne reči). U tom smislu se gornje rešenje ponaša rasipnički prema raspoloživoj memoriji. Zapažanje broj 3: Koristedji gornji potprogram mogu se izračunati vrednosti faktorijela za n = 0, 1, 2, ... , 7 (nenegativne cele brojeve manje od 8). Pitanje broj 1: Koji rezultat daje gornji potprogram za n = 8? Obrazložite dobijeni rezultat. Pitanje broj 2: Koji bi rezultat dao gornji potprogram za n = 9? Proverite na računaru! Predlog broj 1: Poboljšajte gornji program za izračunavanje faktorijela nenegativnog celog broja (n!) tako da se onemogući zadavanje neprihvatljive vrednosti za n. Propratite takve slučajeve odgovarajućim komentarima. Predlog broj 2:
Istražite mogućnost proširenja opsega prihvatljivih vrednosti za n. 2.Rešenje ************************************************************************ * Izračunavanje faktorijela - n! * (drugo rešenje) ************************************************************************ * * N - argument * NF - rezultat * PROGRAM NFAKT2 * INTEGER*4 N, NF, NFAKT OPEN(3, FILE='NFAKT2.R') * 1 PRINT *, ' UNESITE CEO NENEGATIVAN BROJ N (N<13)' READ *, N * IF(N .LT.0) THEN PRINT *, ' UNETI BROJ NE SME BITI NEGATIVAN' GOTO 1 END IF * IF(N .GE.13) THEN PRINT *, ' UNETI BROJ MORA BITI MANJI OD 13' GOTO 1 END IF * WRITE(3, *)' FAKTORIJEL ' WRITE(3, '(/, 6H N = , I5)') N * NF=NFAKT(N) * WRITE(3, '(A, I10, /)') ' N! = ', NF * CLOSE(3) * END FUNCTION NFAKT(N) * INTEGER*4 N, NFAKT * NFAKT=1 DO WHILE(N .GT.1) NFAKT=NFAKT*N N=N-1 END DO * END
Rezultat: FAKTORIJEL N=12 N! = 479001600 Zapažanje broj 5: Dalje proširenje opsega prihvatljivih vrednosti za n se može postići korišćenjem REAL aritmetike. Pitanje broj 3: Do koje vrednosti za n se može, na taj način, dobiti ispravan rezultat za n! ? Utvrdite to preradom gornjeg rešenja. Zapažanje broj 5: Ipak, i takav program daje ispravan rezultat samo za ograničen opseg brojeva. Predlog broj 3: Načinite program za odredjivanje faktorijela nenegativnog celog broja smeštanjem svake, pojedinačne cifre rešenja kao posebnog elementa vektora. 3. Rešenje Sledeće rešenje prevazilazi navedena ograničenja korišćenjem postupka da se svaka cifra broja čiji se faktorijel traži i dobijenog rezultata, smešta kao poseban elemenat vektora. ************************************************************************ * Izračunavanje faktorijela - n! * * (treće rešenje) * ************************************************************************ * * N - argument * L - broj cifara rezultata * A - vektor cifara rezultata * PROGRAM NFAKT3 * INTEGER*2 I, J, N, A(2570) OPEN(3, FILE='NFAKT3.R') * 1 PRINT *, ' UNESITE CEO NENEGATIVAN BROJ N (N<=1000)' READ *, N * IF(N .LT.0) THEN PRINT *, ' UNETI BROJ NE SME BITI NEGATIVAN' GOTO 1 END IF * IF(N .GT.1000) THEN PRINT *, ' UNETI BROJ NE SME BITI VECI OD 1000' GOTO 1 END IF *
WRITE(3, *)' FAKTORIJEL ' * CALL NFKT(N, A, J) * WRITE(3, '(/, I7, A, 56I1, /, (11X, 56I1))') N, '! = ', (A(I), I=J, 1, -1) *
CLOSE(3) * END SUBROUTINE NFKT(N, A, L) * INTEGER*2 I, J, K, L, M, N, A(1) * A(1) = 1 L=1 * DO 1 K=1, N * I=1 J=0 * DO WHILE(J. NE.0.OR. (J. EQ.0.AND. I .LE. L)) M = A(I) * K + J J = M / 10 A(I) = M - J * 10 I=I+1 END DO * L=I-1 * 1 END DO * END Rezultat: FAKTORIJEL 100! = 93326215443944152681699238856266700490715968264381621468 59296389521759999322991560894146397615651828625369792082 7223758251185210916864000000000000000000000000 Predlog broj 4: Proširite gornji program tako da je njime moguće odrediti faktorijele svih nenegativnih celih brojeva iz zadataog intervala. ZADATAK: Stirlingova aproksimacija faktorijela *** Načiniti potprogram tipa SUBROUTINE koji izračunava vrednosti funkcija: u= v = n! w= za n = 25(1)34.U glavnom programu predvideti mogućnost štampanja propratnih tekstova, zaglavlja i tabele vrednosti funkcija u(n), v(n) i w(n) za navedene vrednosti argumenta n. REŠENJE: Stirlingove aproksimacije faktorijela za veliko n, nesumnjivo, spadaju u najpoznatije asimptotske formule, ne samo u ovoj oblasti. Ovde su izabrane kako u svrhu prezentovanja,
relativno brzog i jednostavnog odredjivanja približne, ali najčešće dovoljno tačne, vrednosti faktorijela, tako i u cilju ilustrovanja proširenja opsega prihvatljivih vrednosti za n, korišćenjem REAL aritmetike. ************************************************************************ * Stirlingova aproksimacija n! ************************************************************************ * * N - argument * NF - rezultat * PROGRAM SANF * INTEGER*2 N REAL U, V, W OPEN(3, FILE='SANF. R') * WRITE(3, *)' Stirlingova aproksimacija n! ' WRITE(3, '(/, 3X, 2H N, 7X, 4H N!-, 11X, 3H N!, 12X, 4H N!+)') * DO 1 N=25, 34 CALL SANFKT(N, U, V, W) WRITE(3, '(I5, 3E15.7)') N, U, V, W 1 END DO * CLOSE(3) * END SUBROUTINE SANFKT(N, U, V, W) * INTEGER*2 N REAL E, X, Y, U, V, W, RNFAKT *
DATA E, X/2.718282, 0.9189385/ * Y=N+0.5 U=ALOG(Y/E)*Y+X W=EXP(U) U=EXP(U-1./(24.*Y)) V=RNFAKT(N) * END REAL FUNCTION RNFAKT(K) * INTEGER*2 K, N * N=K RNFAKT=1. DO WHILE(N .GT.1) RNFAKT=RNFAKT*N N=N-1 END DO * END Rezultat: Stirlingova aproksimacija n! N N!N! N!+ 25 .1551118E+26 .1551121E+26 .1553655E+26 26 .4032904E+27 .4032916E+27 .4039254E+27 27 .1088884E+29 .1088887E+29 .1090536E+29 28 .3048883E+30 .3048884E+30 .3053339E+30 29 .8841779E+31 .8841761E+31 .8854243E+31 30 .2652520E+33 .2652529E+33 .2656150E+33 31 .8222820E+34 .8222838E+34 .8233707E+34 32 .2631310E+36 .2631308E+36 .2634679E+36 33 .8683309E+37 .8683318E+37 .8694107E+37 34 .2952316E+39 .2952329E+39 .2955890E+39
ZADACI ZA VEŽBANJE 1. PROSTI BROJEVI Načiniti program za pronalaženje i štampanje svih prostih brojeva manjih od datog prirodnog broja N. ***. PROSTI BROJEVI *** Načiniti program za pronalaženje i štampanje prvih n (n<100) prostih brojeva. Definicija: Prost broj je samo onaj broj koji je djeljiv sa 1 i sa samim sobom. Nije teško dokazati da treba da tražimo delioce u skupu prostih brojeva manjih ili jednakih korenu posmatranog broja n, odnosno ako se svaki broj može razbiti na proste činioce dovoljno je ispitati proste delioce. Problem ćemo rešiti u FORTRANU i generisaćemo prvih 50 prostih brojeva:
INTEGER X(100), OST X(1)=1 X(2)=2 X(3)=3 K=3 N=3 20 N=N+2 I=3 10 KOL=N/X(I) OST=N-KOL*X(I) IF (OST.EQ.0) GO TO 20 IF (I.EQ.K) GO TO 40 I=I+1 IF ((X(I).LE.N) GO TO 10 40 K=K+1 X(K)=N IF (K.LT.50) GO TO 20 WRITE (6.1) (X(I), I=I,50) 1 FORMAT (‘ ‘, 518) STOP END Rezultat je: 1,2,3,5,7,.....,227. 2. BLIZANCI Blizanci su dvojke prostih brojeva međusobno različitih za 2. Načiniti program za štampanje svih prostih brojeva blizanaca manjih od N (N=10.000). 3. PROSTI ČINIOCI Načinite program za određivanje svih prostih činilaca datog prirodnog broja N. 4. SAVRŠENI BROJEVI Načinite program koji omogućava nalaženje savršenih brojeva na intervalu zadatom brojevima M i N. (Napomena: broj se naziva savršenim ako je jednak zbiru svojih činilaca, uključujući 1 ali ne uključujući samoga sebe. Na primer, 6 je savršen broj, jer je 6=1+2+3.) ***. NAJVEĆI ZAJEDNIČKI DELILAC – NZD Najveći zajednički deliliac dva prirodna *** broja je najveći broj kojim možemo podeliti i broj m i broj n a da pri tome nemamo ostatka. Algoritam: *** KORAK 1. Podeliti m sa n i ostatak zapamtiti u r KORAK 2. Ukoliko je r jednako 0, NZD je n i KRAJ, u suprotnom prelazimo na KORAK 3 KORAK 3. Zameniti m sa n, n sa r, i preći na KORAK 1 Euklidov algoritam:
program euklid; var broj1, broj2 : longint; function NZD(b1, b2 : longint) : longint; var t : longint;
begin while (b1 > 0) do begin if (b1 < b2) then begin t := b1; b1 := b2; b2 := t; end; b1 := b1-b2; end; NZD := b2; end; begin write('Upisite prvi broj > '); readln(broj1); write('Upisite drugi broj > '); readln(broj2); writeln('NZD(',broj1,',',broj2,') = ',NZD(broj1,broj2)); end. 5. NAJMANJI ZAJEDNIČKI SADRŽALAC – NZS Koristedji Euklidov algoritam za nalaženje najvećeg zajedničkog delioca načiniti program za nalaženje najmanjeg zajedničkog sadržaoca datih celih brojeva. Algoritam realizovati u opštem obliku a posebne podatke uneti na početku glavnog programa. ***. FIBONAČIJEVI BROJEVI 6. AMSTRONGOVI BROJEVI Broj se naziva Amstrongovim brojem reda K ako je jednak zbiru K-tih stepena svojih cifara (npr. 371=33+73+13 je Amstrongov broj trećeg reda). Načiniti program koji će u zadatom intervalu M, N pronaći sve Amstrongove brojeve. 7. Dat je prirodan broj M i celobrojni niz A(M). Prebrojati i štampati koliko različitih brojeva ima u ovom nizu. (Na primer, u nizu Š 5, 7, 5Ć postoje 2 različita broja: 5 i 7). 8. Može li se zadati prirodan broj M predstaviti kao zbir dva kvadrata? Načiniti program koji rešava ovaj zadatak. 9. Dat je dvodimenzionalni celobrojni niz A(2,15). Poznato je da su samo dva broja iz niza međusobno jednaka. Štampati njihove indekse. 10. Sastaviti algoritam, načiniti program i nacrtati blok-šemu za određivanje najvećeg (najmanjeg) broja koji se može smestiti u računar. 11. Broj 32759 ima zanimljivo svojstvo: pri deljenju sa 2 daje ostatak 1, pri deljenju sa 3 daje ostatak 2, ... . , pri deljenju sa 10 daje ostatak 9. Ipak, to nije najmanji broj sa tim svojstvom. Načinite program za utvrđivanje najmanjeg prirodnog broja sa navedenom osobinom. 12. Načinite program koji će pronaći sve šestocifrene brojeve koji pomnoženi sa jednocifrenim brojem između 2 i 9 daju broj sastavljen od istih cifara, ali napisanih u obrnutom poretku. Primer: 109989 x 9 = 989901; 219978 x 4 = 879912. 13. Dati su prirodni brojevi M i N. Naći takve prirodne brojeve M1 i N1 koji nemaju zajedničkih delilaca, tj. M1/N1=M/N.
14. Podeliti dva prirodna broja na zadat broj decimala, N (N<50) koristeći pravilo za ručno deljenje. 15. Popunite prazna mesta tako da zbirovi budu jednaki datim: #_______________$ 9 ? ? 5 ? =23 ?---------------? ?? ? 8 ? ? 2 =24 ?---------------? ?? 2 ? ? 1 ? =17 ?---------------? ?? ? 4 ? ? 3 =10 3---------------4 =20 =20=20=20 16. EGIPATSKO RASTAVLJANJE Učitati brojilac i imenilac razlomka, pa ga prikazati kao zbir razlomaka čiji je bojilac jednak 1 (Egipatsko rastavljanje). (Na primer: 5/6=1/2+1/3.) 17. "DEDA I UNUK" Ako se dvocifreni brojevi, koji predstavljaju godine starosti unuka i dede, saberu sa svojim ciframa, dobijaju se brojevi koji pak sabrani sa svojim ciframa, postaju jednaki godinama starosti unuka i dede, napisanih obrnutim redosledom. Načiniti program koji utvrđuje godine starosti unuka i dede. (Uzeti u obzir da je razlika u godinama unuka i dede bar 36 godina). 18. Zbir svih šest dvocifrenih brojeva koje je moguće formirati od cifara traženog broja ravan je dvostrukom traženom broju. Načiniti program za nalaženje traženog broja. 19. Na livadi kružnog oblika poluprečnika R (R=20m) vezana je kanapom koza za rub livade. Načiniti program kojim se određuje dužina kanapa tako da koza može da popase samo pola livade. 20. Svako od upotrebljenih slova u sledećim računanjima predstavlja jednu od cifara dekadnog sistema. Načiniti program koji utvrđuje koja od cifara stoji iza kog slova. A * BC= DEF G * HI= DEF HEJ*HEJ=EHIJJ 21. Svako od upotrebljenih slova u sledećim računanjima predstavlja jednu od cifara dekadnog sistema. Načiniti program koji utvrđuje koja od cifara stoji iza kog slova. DVA + TRI --------PET 22. Svako od upotrebljenih slova u sledećim računanjima predstavlja jednu od cifara heksadecimalnog sistema. Načiniti program koji utvrđuje koliko je
CIGI+GBED=**** ako je ABEC+BGBF=CIGI i 4 * A L I E = G B E D. 23. Načiniti program za nalaženje petocifrenog broja X, koji ako se pomnoži sa 13, a zatim podeli sa 11, daje broj koji se dobija preokretanjem cifara broja X. (Na primer: 3024 * 13 / 11 = 4203.) 24. Načiniti program za nalaženje tri racionalna broja koji obrazuju aritmetičku progresiju, a njihov proizvod iznosi 11. 25. U izrazu ((((1 ? 2) ? 3) 4 ?) 5 ?) ? 6) zameniti znakove ? znacima jedne od 4 aritmetičke operacije +, -, *, /, tako da rezultata bude 35 (pri deljenju celih brojeva odbacuje se ostatak). Dovoljno je naći jedno rešenje. 26. Učitati realan broj A i prirodan broj K. Izračunati i štampati KA . Pretpostaviti da je K toliko veliko da se ne može u prihvatljivom vremenu izvršiti K množenja i da se ne mogu koristiti funkcije logaritma i eksponenta. *** 27. Štampati brojevni trapez: 1*8+1=9 12*8+2=98 123*8+3=987 . ... . ... . ... . 123456789*8+9=987654321 28. Odrediti najmanji prirodan broj čija je prva cifra 1 i koji posle množenja sa 3 menja oblik tako što jedinica sa prvog mesta prelazi na poslednje. Vrednost i redosled ostalih cifara ostaju nepromenjeni. 29. Za datu vrednost prirodnog broja N izračunati zbir prvih N članova niza 1, 11, 111, 1111, 11111, ... N 30. Za datu vrednost prirodnog broja N izračunati N!-2. 31. SSSR Za prirodne brojeve H i U kažemo da se H sadrži u U-u ako binarni oblik broja H možemo dobiti iz binarnog oblika broja U izbacivanjem nijedne, jedne ili više cifara. (Na primer, H=1010 se sadrži u U=1001100). Načiniti algoritam koji će za dva data prirodna broja A i V naći najveći broj S koji se sadrži i u A i u V. 32. NRB Dat je neuređen skup prvih N prirodnih brojeva. Načiniti program kojim se ovi brojevi raspoređuju u N jednakih grupa, tako da sume brojeva po grupama budu međusobno iste. Posebni podaci: N=4, S=(13, 9, 7, 15, 1, 3, 11, 4, 5, 2, 14, 12, 8, 16, 6, 10) 33. ČSSR Dato je N kartica numerisanih brojevima 1, 2, 3, ... , N. (Bilo koji broj se javlja samo jednom). Načiniti algoritam koji iz proizvoljnog niza A1, A2, A3, ... , AN tih kartica nalazi način za
ređanje kartica u rastući (po oznakama na njima) redosled s tim da broj zamena mesta bude minimalan. Pod zamenom se podrazumeva međusobno menjanje mesta dve kartice. *** Primer: za redosled 1, 5, 3, 2, 4 su neophodne dve zamene: 5 sa 2 i 4 sa 5, posle čega se dobija redosled 1, 2, 3, 4, 5. 34. ČSSR Programirajte sledeću igru: Za zadati fiksirani prirodni broj N>1 igrač A bira prirodni broj X
39. Ceo nenegativan broj M zadat je nizom svojih binarnih cifara a 0a1a2 ... an-1 (pri čemu je ai = 0 ili ai = 1 , i=0, 1, ... , n-1). Štampati niz binarnih cifara broja M+1. 40. Prirodan broj M zapisan je u binarnom sistemu u inverznom poretku. Dobijeni broj uzima se za vrednost funkcije V(M). Štampati vrednosti V(M) za M = 512, 513, ... , 1023. 41. Dva niza brojeva x i i yi (i=1, 2, ... , n) formiraju n uređenih parova kojima su zadate koordinate n tačaka u ravni. Načiniti program za nalaženje najkraćeg rastojanja između dve tačke iz datog skupa tačaka. 42. Zadat je niz A(M) uzajamno različitih celih brojeva. Štampati sve permutacije ovih brojeva. 43. Načiniti program za generisanje i štampanje svih kombinacija bez ponavljanja k-te klase od n različitih elemenata a 1, a2, ... , an realnih brojeva za svako k za koje važi 1