Hirdetés

Új hozzászólás Aktív témák

  • Gyuri16
    senior tag

    Na, közben rohangásztam, meg kajáltam, de végül sikerült megírni, jól telepakoltam neked kommentekkel, hogy értsd, mit miért csináltam. :D

    #include <stdio.h>
    #include <math.h> /* gyökvonás miatt */
    #include <ctype.h> /* isdigit() miatt */
    #include <stdlib.h> /* atoi miatt */

    int prime_or_not(int number); /* deklaráljuk, hogy van ilyen fv.-ünk. Most nem a feladatban meghatározott legrosszabb algoritmust fogom használni. */

    int main(int argc, char *argv[])
    {
    int min, max, temp;

    if(argc<3){
    /* hibaüzenetek, kilépés hibával */
    fputs("Tul keves a parameter!\n", stderr);
    return -1;
    }

    if( isdigit(*argv[1]) )
    min = atoi(argv[1]);
    else{
    fputs("Az elso parameter nem szam!\n", stderr);
    return -1;
    }

    if( isdigit(*argv[2]) )
    max = atoi(argv[2]);
    else{
    fputs("A masodik parameter nem szam!\n", stderr);
    return -1;
    }

    if(min>max){ /* ezt egy fv.-be is lehetne írni [swap(min,max);], most nem tököltem vele */
    temp=min; /* átmenetileg eltároljuk min értékét, aztán átadjuk max-nak */
    min=max;
    max=temp;
    }

    printf("A %d es %d kozotti primszamok:\n",min,max);
    /* jöhet a prímtesztelés, prímek kiírása */
    for(;min<=max;++min)
    if(prime_or_not(min))
    printf("%d\n",min);

    return 0; /* VÉGE */
    }

    /***** Prímtesztelő függvény *****/

    int prime_or_not(int number){
    int i, divider, max;
    if(number==0 || number==1) return 0; /* ezek nem prímek! */

    max=(int)(sqrt(number)+1); /* "Csak a p≤(négyzetgyök n) -ig szükséges próbálkozni." lásd pl. Wikipédia. Itt: cast-olás. */

    for(divider=1,i=2;(i<max && divider<2);++i)
    /* divider<2-nek az az oka, hogy meghatároztuk a max-ot, és az semmiképp nem érheti el magát a számot, így jelen esetben önmaga nem lesz osztója (mint a szabály szerint), így a divider 2-re se mehet fel a prímeknél sem */
    {
    if(number%i==0) /* ha maradék nélkül megvan a számban az i aktuális értéke */
    divider=i;
    }
    if(divider>1) return 0; /* nem prím */
    return 1; /*egyébként prím */
    }

    szerintem a prime_or_not nagyon szerencsetlen fuggvenynev, hiszen a "prim vagy nem" mindig igaz, nem egyertelmu mit csinal a fuggveny. inkabb is_prime vagy hasonlo javasolt.
    igen, szeretem mas kodjat kritizalni ;]

    te mar a jobb verziot csinaltad, ami csak a gyokeig keresi az osztokat. viszont foloslegesen mesz vegig az osszes oszton, ha mar megtalaltad, hogy valami osztja (divider valtozod), ott mar ki tudod jelenteni, hogy nem prim

    itt az en verziom (tiedet felhasznalva), ami jobban koveti az eredeti kiirast (ezert aztan butabb is, viszont lehet kicsit egyszerubb):

    #include <stdio.h>
    #include <ctype.h> /* isdigit() miatt */
    #include <stdlib.h> /* atoi miatt */

    int prim(int i);

    int main(int argc, char *argv[]) {
    /* beolvasas, ugyanaz.. */

    int i;
    for (i=min; i<=max; i++) {
    if (prim(i))
    printf("%d\n",i);
    }
    }

    int prim (int i) {
    if (i<2)
    return 0;
    int j;
    for (j=2; j<i; j++) // itt eleg lenne sqrt(i)-ig
    if (i%j==0)
    return 0;
    return 1;
    }

Új hozzászólás Aktív témák