Java programiranje

iverson

Pripravnik
4. okt 2007
611
0
16
Kamniško Savinjske Alpe
Se pravi moram napisati več for zank ali samo eno? Pač na srednji nisem imel programiranja, sem bolj nov. Katera je kaj dobra knjiga, da se čim bolj naučim. Gledal sem danes Java2 od Mesojedca. Mi lahko kakšno predlagaš? Lahko je angleška, ker mi le ta ne dela težav.
 

philips

Guru
Osebje foruma
Administrator
17. avg 2007
9.861
689
113
Za izpis od 1 do 100 rabiš samo en for stavek, znotraj njega pa preveriš ali je trenutno število praštevilo in ga izpišeš.
Samo zdaj sem nekaj gledal... tiste metode isPrime() ne najdem na uradnem APIju (zgleda je to custom Math nekdo napisal). Bo treba svojo metodo napisat
smile-1.gif


Drugače osnove programiranja so ti jasne ? Torej if stavki, for/while/... zanke ?

Metoda za preverjanje praštevila je v bistvu taka, da število deliš z vsemi števili do njegovega korena (dlje ni treba it). Ena optimizacija pa je, da število deliš samo z lihimi števili (torej 3, 5, 7 ...), v samem začetku pa preveriš ali je sodo* in ali je manjše od 2.
* potem primerjaš ali je enako 2 in vrneš true, če pa je različno od 2 pa false.

Metoda za preverjanje praštevila izgleda v PHPju nekako tako:
Koda:
function jePrastevilo($neko_stevilo) {

    // ce je manjse ali enako 1
    if($neko_stevilo <= 1) return false;
    // ce je 2
    elseif($neko_stevilo == 2) return true;
    // ce je sodo (in razlicno od 2)
    elseif($neko_stevilo % 2 == 0) return false;
    // drugace pa preveri
    else {
        
        for($x = 3; $x <= ceil(sqrt($neko_stevilo)); $x+=2) {
            
            // obstaja deljitelj -> ni prastevilo
            if($neko_stevilo % $x == 0) return false;
            
        }
        
        // ni deljitelja -> je prastevilo
        return true;
        
    }
    
}
V javi bo koda praktično enaka (razen razlik v sintaksi in korenjenu+zaokrožanju števil)
 

mihi

Pripravnik
14. apr 2008
222
0
16
Kaj se tule sploh pravo nalogo rešuje?

Pitagorejska števila niso isto kot praštevila.
Za pitagorejska števila velja pitagorov izrek x*x + y*y = z*z (primer: 3*3 +4*4 =5*5)
 

philips

Guru
Osebje foruma
Administrator
17. avg 2007
9.861
689
113
Citat:
Uporabnik mihi pravi:
Pitagorejska števila niso isto kot praštevila.

Narobe prebral
redface-1.gif

Postopek je v bistvu enak, samo da bo druga metoda za preverjanje števil (pitagorejska namesto za praštevila).
 

philips

Guru
Osebje foruma
Administrator
17. avg 2007
9.861
689
113
Zdaj sem na hitro napisal en java class za izpis vseh trojic (a, b, c), pri čemer velja a*a + b*b = c*c. Upam da ne rabite paziti še na to, da so a, b in c tuja števila (torej primitivna pitagorejska trojica), ker tisto še malo zakomplicira zadevo
rolleyes-1.gif


Koda:
public class Pitagorejska {

    public static void main(String[] args) {
        
        int doStevila = 100;
        int stTrojic = 0;
        
        for(int c = 1; c <= doStevila; c++) {
        
            for(int b = 1; b < c; b++) {
                
                for(int a = 1; a <= b; a++) {
                    
                    if((a*a + b*b) == c*c) {
                        
                        System.out.println("(" + a + ", " + b + ", " + c + ")");
                        stTrojic++;
                        
                    }
                    
                }
                
            }
            
        }
        
        System.out.println("Stevilo trojic: " + stTrojic);
        
    }

}

V bistvu imaš tri zanke, ki ti generirajo vsa tri števila a, b in c. Prvo gre c od 1 do 100, za b je dovolj da gre le do c (večji ne more bit), a pa gre samo do b -> da ne dobimo podvojenih rezultatov kot recimo (3, 4, 5) in (4, 3, 5) ki predstavljajo isto trojico.

V tretji for zanki pa nato samo preveriš ali velja enakost in izpis. Dodal sem še tudi štetje trojic.
 

mihi

Pripravnik
14. apr 2008
222
0
16
Za primerjavo še isto v Pythonu:

Koda:
from math import *

def Pitagora(n):
   i=0
   for c in range(2,n):
      for b in range(1,c):
        a=sqrt(c*c-b*b)
        if a==int(a) and a<b:
           print int(a),b,c
           i+=1 
   print i

Pitagora(100)
 

iverson

Pripravnik
4. okt 2007
611
0
16
Kamniško Savinjske Alpe
Samo nekaj me zanima, tukaj mi izpiše 6 ki pa ni pitagorejsko število? Nič ne piše da moramo na kaj paziti, ampak samo izpis št. 1 do 100 ki so pitagorejska.
 
Nazadnje urejeno:

mihi

Pripravnik
14. apr 2008
222
0
16
Samo število 6 ni pitagorejsko, trojica 6, 8 in 10 so pitagorejska števila
6*6 + 8*8 = 10*10
 

philips

Guru
Osebje foruma
Administrator
17. avg 2007
9.861
689
113
Ti iščeš trojice števil in ne samo eno število. Če je bila 6 v kakšni pitagorejski trojici, potem je že prav.
Razen če morate vi izpisovati samo primitivne pitagorejske trojice ? Tam pa res ni nikjer 6 not.
 

philips

Guru
Osebje foruma
Administrator
17. avg 2007
9.861
689
113
Primitivne trojice do 100 so te:
Koda:
( 3, 4, 5) 	( 5, 12, 13) 	( 7, 24, 25) 	( 8, 15, 17)
( 9, 40, 41) 	(11, 60, 61) 	(12, 35, 37) 	(13, 84, 85)
(16, 63, 65) 	(20, 21, 29) 	(28, 45, 53) 	(33, 56, 65)
(36, 77, 85) 	(39, 80, 89) 	(48, 55, 73) 	(65, 72, 97)

Vir: http://en.wikipedia.org/wiki/Pythagorean_triple

Tako da bo potrebno program spremeniti tako, da preveri še ali so števila paroma tuja.
 

mihi

Pripravnik
14. apr 2008
222
0
16
Kako se naloga natančno glasi, kako je dobesedno formulirana?

Narediti je treba samo tisto, kar naloga zahteva in ničesar drugega.
Tu ni kaj brati "med vrsticami" in ugibati, vse mora biti že v nalogi jasno povedano.
Če v nalogi nič ne piše o primitivnih in podobnih številih, jih kar pozabi, saj jih naloga ne zahteva in si jih ni treba dodatno izmišljevati.

Zakaj misliš, da 6 ne more biti pitagorejsko število? Je kje v nalogi kakšen namig ali primer ali kaj*
 

mihi

Pripravnik
14. apr 2008
222
0
16
Še primer, kako se poišče samo primitivne trojice v Pythonu:

Koda:
from math import *

def SkupniImenovalec(a,b):
   while b!=0:
      r=a%b
      a=b
      b=r
   return a

def Pitagora(n):
   i=0
   for c in range(2,n):
      for b in range(1,c):
        a=sqrt(c*c-b*b)
        if a==int(a) and a<b and SkupniImenovalec(b, int(a))==1:
           print int(a),b,c 
           i+=1 
   print i

Pitagora(100)
 

mihi

Pripravnik
14. apr 2008
222
0
16
Nič ne vidim, ker bi se moral logirati.
Priloži copy/paste teksta naloge?