C/C++ program za racunanje N-tog rpostog broja

poruka: 25
|
čitano: 20.815
|
moderatori: XXX-Man, vincimus
1
+/- sve poruke
ravni prikaz
starije poruke gore
15 godina
neaktivan
offline
C/C++ program za racunanje N-tog prostog broja

Evo ovako... napravija sam program koji za upisani n nade n-ti prosti broj...ali koristio sam polja pa tako da je maximum n zapravo maximum polja....

 

evo programa:

#include <stdio.h>

#include <conio.h>
main (){
    int p[251],b=0,z[5],n,i=5,x=4,t,j;
    
    start: printf("Unesi n[0<n<=250]: ");
    scanf("%d", &n);
    if (n<1 || n>250){
     printf("Krivi upis!\n\n");
     goto start;
     }
    
    p[1]=2; p[2]=3; p[3]=5; p[4]=7;
    z[1]=1; z[2]=3; z[3]=7; z[4]=9;
    
    while (i<=n){
       x++;
       if (x==5){
        b+=10; x=1;
        }
       t=b+z[x];
       for (j=2; j<i; j++){
         if (t%p[j]==0){
          t=0; break;
          }
         }
       if (t!=0){
        p[i]=t; i++;
        }
       }
    
    printf("%d. prosti broj je: %d", n,p[n]);
    
    getch();
    }
pa zanima me postoji li jednostavniji nacin od stavljanja dvodimenzionalnih polja [][] ili trodimenzionalnih [][][]
:))

 

Poruka je uređivana zadnji put sub 20.11.2010 11:11 (calex3).
 
0 0 hvala 0
17 godina
neaktivan
offline
C/C++ program za racunanje N-tog rpostog broja

malloc ili new

 
0 0 hvala 0
15 godina
neaktivan
offline
RE: C/C++ program za racunanje N-tog rpostog broja
Tom69 kaže...

malloc ili new

ako mozes pojasnit :D

16 godina
neaktivan
offline
RE: C/C++ program za racunanje N-tog rpostog broja

Zašto uopće pamtiš sve proste brojeve do n-tog? Ako želiš samo n-ti, onda ti polje ne treba. Budem ja nešt nakucal na brzinu pa stavim.

 

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int prost(int x)
{
     int i;

     if (x==2 || x==3 ) return 1;

     if ( x%2==0 ) return 0;

     for (i=3;i<=sqrt(x);i+=2)
       if ( x%i==0 ) return 0;
      
     return 1;
}

int main()
{
    int i=2,koji=0,n;
   
    do
    {
        printf("Ucitaj n: "); scanf("%d",&n);
    } while ( n<=0 || n>50000);
   
    while(koji<n)
    {
        if ( prost(i) ) ++koji;
        ++i;
    }
   
    --i; //jer ce jednom previse povecat i
    printf("%d. prosti broj je %d!\n",koji,i);
   
    system("pause");
    return 0;   
}

http://manutd-croatia.com/forum/index.php ... forum i udruga navijača Manchester Uniteda...
Poruka je uređivana zadnji put sub 20.11.2010 15:57 (Luuka).
15 godina
neaktivan
offline
RE: C/C++ program za racunanje N-tog rpostog broja

moram pamtiti...

algoritam radi tako da eliminira brojeve sa znamenkom jedinice 2,4,5,6,8,0 medu svakih 10 brojeva i da provjeri ostale brojeve 1,3,7,9 da li su djeljivi sa proslim prostim brojevima....ovo je najbrzi nacin...puno je brze od gledanja svakog iduceg da li je djeljiv sa svim brojevima do njegovog broj/2 ....

16 godina
neaktivan
offline
RE: C/C++ program za racunanje N-tog rpostog broja

Moguće da će bit nešto brže i to za velike n-ove, ali će i puno više memorije zauzet pa s te strane nije dobro.

I preporučam do while petlju za učitavanja, s goto ćeš se samo gubit u većim programima.

 

Evo gore mog koda, provjeravam do sqrt(broj) jer nema potrebe dalje (probaj dokazati!). Čim se naleti na djelitelja petlja u pomoćnoj funkciji prestaje pa neće provjeravati sve brojeve.

 

A malloc i new su Covska i C++ovska funkcija za alokaciju memorije. S njima možeš tokom izvođenja programa zauzeti memorije točno koliko ti treba. Za njih treba znati baratati s pointerima, a ne znam da li si došao do tog.

 

Btw moj program trenutno daje 10 000. prosti broj, za 50 000. mu treba dvije,tri sekunde, pa mislim da nema potrebe za kompliciranjem oko brzine, a polje od 10000 intova će bit podosta veliko  :D

http://manutd-croatia.com/forum/index.php ... forum i udruga navijača Manchester Uniteda...
Poruka je uređivana zadnji put sub 20.11.2010 12:16 (Luuka).
15 godina
neaktivan
offline
RE: C/C++ program za racunanje N-tog rpostog broja

otprilike shvacan ovo sa sqrt() ...

#include <stdio.h>

#include <conio.h>

#include <math.h>

 

main (){

    int a=21, i, br=0;

 

    for (i=2; i<=a/2; i++){

      if (a%i==0){

       printf("%d\n", i);

       br++;}

      }

    printf("\n%d\n\n", br);

    br=0;   

    for (i=2; i<=sqrt(a); i++){

      if (a%i==0){

       printf("%d\n", i);

       br++;}

      }

    printf("\n%d", br);

 

    getch();

    }

evo ovako sam probao da vidim razliku...znaci do korijena broja se nalazi barem jedan od njegovih djeljitelja? :D  i svaki put je duplo vise djeljitelja unuta 1-n/2 nego od 1-sqrt(n)
ugl. ovo mi trebalo jer na natjecanjima mi pise vremensko ogranicenje programa pa me zanimalo u ovom slucaju ...
hvala hvala :D

16 godina
neaktivan
offline
RE: C/C++ program za racunanje N-tog rpostog broja

Btw testiraj moj i svoj program za n=50 000 (kod sebe promijeni veličinu polja i uvjet kod učitavanja) pa ćeš vidjet razliku ;)

Moj je neusporedivo brži tako da sva teoretska razmatranja ti padaju u vodu :D

 

A što se tiče provjere prostosti od x, dovoljno je gledati do sqrt(x) jer iza tog broja sigurno neće biti nijedan djelitelj osim eventualno x. To je lako i matematički dokazat.

http://manutd-croatia.com/forum/index.php ... forum i udruga navijača Manchester Uniteda...
Poruka je uređivana zadnji put sub 20.11.2010 13:01 (Luuka).
14 godina
neaktivan
offline
C/C++ program za racunanje N-tog rpostog broja

bool isprost(int n){

 

if( n == 2 || n == 3 ) return 1;

if( (n -1)%6 != 0 || (n+1)%6 != 0) return 0;

 

if( i % 2 == 0) return 0;

 

for( int i = 3 ; i < sqrt(n) +1 ; i=i+2) if(n % i == 0) return 0;

 

return 1;

}

prof.dr.ing.sc.
Poruka je uređivana zadnji put sub 20.11.2010 13:16 (Pijavica).
Moj PC  
0 0 hvala 0
16 godina
neaktivan
offline
RE: C/C++ program za racunanje N-tog rpostog broja

dobra ideja za eliminirat parne, ubacio sam gore {#}

http://manutd-croatia.com/forum/index.php ... forum i udruga navijača Manchester Uniteda...
15 godina
neaktivan
offline
RE: C/C++ program za racunanje N-tog rpostog broja

nisam eliminira samo parne :DD eliminiraj i sve koji su djeljivi sa 5...

 

znaci sad mogu isti onaj moj kod di provjerava sve brojeve medu 10 brojeva sa znamenkama 1,3,7,9 i samo da provjeri jesu li djeljivi od 2 do sqrt(x)  :DD

eto kasnije cu napravit funkciju koja ce racunat nti prosti broj pa cu moc napravit i program koji rastavlja brojeve na proste faktore :D

Poruka je uređivana zadnji put sub 20.11.2010 16:31 (calex3).
16 godina
neaktivan
offline
RE: C/C++ program za racunanje N-tog rpostog broja

Pijavica je eliminiro parne :D

 

A ovo tvoje je sporije od mojeg, tak da bi dosta trebalo to ubrzat :D

http://manutd-croatia.com/forum/index.php ... forum i udruga navijača Manchester Uniteda...
15 godina
neaktivan
offline
RE: C/C++ program za racunanje N-tog rpostog broja

Kako? xD

Moj ide za svaka 4 broja medu 10 brojeva i provjeraje "bivše" a tvoj ide za svaki I od 2 pa nadalje i provjeraje do sqrt()? :D

samo sta moj radi do 250 :'(

 

pogledaj moj malo bolje radi na principu b+=10 medu deset brojeva...te onda b+z[x] gdje je z[x] jedinice 1,3,7,9 tako da je tu eliminirano brojevi dijeljivi sa 2,5 :))) :PPP

Poruka je uređivana zadnji put ned 21.11.2010 0:02 (calex3).
16 godina
neaktivan
offline
RE: C/C++ program za racunanje N-tog rpostog broja

Pohvalil sam od pijavice ideju, on je samo parne maknul ;-) A ti makneš puno više, puno manje provjeravaš, puno više mjesta zauzmeš i puno je sporije :D

http://manutd-croatia.com/forum/index.php ... forum i udruga navijača Manchester Uniteda...
Poruka je uređivana zadnji put ned 21.11.2010 0:38 (Luuka).
15 godina
neaktivan
offline
RE: C/C++ program za racunanje N-tog rpostog broja

evo poslusat cu vas :D

 

NOVI KOD:

#include <stdio.h>

#include <conio.h>

#include <math.h>

//Funkcija za provjeru jeli broj prost//

int prosti(int x){

   int i;

 

   if (x==2) return 1;

   if (x%2==0) return 0;

 

   for (i=3; i<=sqrt(x); i+=2)

     if (x%i==0) return 0;

   return 1;

   }

//Funkcija koja za uneseni n vrati n-ti prosti broj//

int nprosti(int x){

   int i=0, p=2;

 

   while (i<x){

      if (prosti(p)) i++;

      p++;

      }

 

   p--;

   return p;

   }

//Test Funkcije//

main (){

    int n;

 

    do {

     printf("Odaberi N [1<=N<=50000]: ");

     scanf("%d",&n);

     } while ( n<=0 || n>50000);

 

    printf("%d. prosti broj je %d", n,nprosti(n));

    getch();

    }

14 godina
neaktivan
offline
Programiranje u C-u

Imam zadatak napraviti program koji unosi jedan cijeli broj te ispisuje da li je on prost ili ne. E sad me zanima kako kreirati for petlju. Ja sam to napravio ovako:

for(i=2; i<=(n-1); i++)

{ if(n%i==0)

   printf("Broj nije prost.");

   else

   printf("Broj je prost.");

}

getch();.....i kak to već ide do kraja

}

Ali on meni ispiše "Broj je prost." onoliko puta koliki je uneseni broj n. Kako to srediti da mi ispisuje samo jednom. Kao unos Broj 997.

Moj PC  
0 0 hvala 0
17 godina
offline
C/C++ program za racunanje N-tog rpostog broja

Pokušaj ovo, efektnije je od tolikih djeljenja:

 

 

class Program

   {

 

 

 

     static void Main(string[] args)

     {

       int broj = 739;

       BitArray niz = new BitArray(broj + 1, true);

 

       for (int i = 2; i <= broj; i++)

         if (niz[i])

         {

           for (int j = i * 2; j <= broj; j += i)

             niz[j] = false;

         }

 

 

       if (niz[broj])

       {

         Console.WriteLine("Broj je prost!");

       }

       else

       {

         Console.WriteLine("Nije prost broj!");

       }

 

 

     }

   }

 
0 0 hvala 0
14 godina
neaktivan
offline
Re: C/C++ program za racunanje N-tog rpostog broja

ok...hvala...ali još me muči kad u onaj moj kod unesem broj 4. Program mi ispiše Broj nije prost i onda ispod toga Broj je prost.?????ne kužim zašto. i Zanima me kako mogu odrediti koliko će se puta nešto ispisati.

 

17 godina
offline
Re: C/C++ program za racunanje N-tog rpostog broja
B3Arf00t kaže...

ok...hvala...ali još me muči kad u onaj moj kod unesem broj 4. Program mi ispiše Broj nije prost i onda ispod toga Broj je prost.?????ne kužim zašto. i Zanima me kako mogu odrediti koliko će se puta nešto ispisati.

 

Ovako napiši:

 

 

#include<stdio.h>

#include<stdlib.h>

 

 

 

int main()

{

int i, n, kontrolna = 1;

scanf("%d", &n);

for(i=2; i<=(n-1); i++)

{ if(n%i==0) {

   printf("Broj nije prost.");

   kontrolna = 0;

   break;

 

}

}

if (kontrolna)

printf("Broj je prost");

}

 

 

 

Radio si grešku u if else bloku, svaki put kad se izvrši petlja ti si izvršavao ili if ili else granu, zato se dešavalo da ti tako ispisuje

 

for(i=2; i<=(n-1); i++)

{ if(n%i==0)

   printf("Broj nije prost.");

   else

   printf("Broj je prost.");

}

getch();

Tu ti je bila greška, za svaku iteraciju petlje se izvršavao ili if ili else blok uvjetne naredbe, dakle za broj 4 ti se ovo desilo:

1. u prvoj iteraciji petlje ispituje se uvjet 4%2 == 0, pošto je true, program ispisuje "Broj nije prost"

2. u drugoj iteraciji petlje ispituje se uvjet 4%3 == 0, pošto je false, program ispisuje naredbu iz else bloka: "Broj je prost!".

 

Ako pogledaš što sam ja napravio bit će ti jasno kako ćeš "kontrolirati ispis", kako kažeš

U petlji sam ostavio samo if granu uvetne naredbe, i to tako da bude "ciao, nema više", čim se ispuni uvjet da je broj djeljiv sa

brojem ispod sebe, znači da nije prost broj, dalje mi petlja ne treba, i prekidam je sa naredbom break.

Kontrolna varjabla ima samo jednu svrhu, da se ispiše ili ne ispiše linija "Broj je prost!", a ta linija će se ispisati samo ako nijednom

tokom izvršavanja petlje nije uvjet n%i == 0 imao vrijednost true, odnosno ako broj nije djeljiv ni sa jednim brojem manjim od sebe,

dakle ako je prost broj.

 

Poruka je uređivana zadnji put ned 27.3.2011 13:15 (Floki).
14 godina
neaktivan
offline
Re: C/C++ program za racunanje N-tog rpostog broja

puno hvala {#}

14 godina
neaktivan
offline
C/C++ program za racunanje N-tog rpostog broja

Nisam puno gledao vase kodove, ali najbrzi (daleko) algoritam za trazenje prostih jes eratostenovo sito.

Algoritam radi na nacin da ides redom po nekom skupu brojeva, kada naiđeš na broj oznacis ga kao prostog i izbacis sve visekratnike toga broja iz skupa.

Istina je sto je Luuka rekao da to uzima puno memorije, ali dobivas na vremenu.

Nakon sto netko unese N, alociras polje na sljedeci nacin

 

int *A = new int[N+1] // C++

int *A = (int*)malloc( (N+1) * sizeof int )

 

Sve postavis na 1 i pises ostatak algoritma.

 

Evo kod na brzaka, mozda ima gresaka nije testiran ..

 

for ( int i = 2; i <= N; ++i )

  if ( prim[i] )

    for ( int j = 2*i; j <=N; j += i )

      prim[j] = 0;

 

Ovo se naravno moze jos optimizirati po potrebi ....

 

Poruka je uređivana zadnji put pon 28.3.2011 12:37 (Budimir).
 
0 0 hvala 1
17 godina
offline
Re: C/C++ program za racunanje N-tog rpostog broja
Budimir kaže...

Nisam puno gledao vase kodove, ali najbrzi (daleko) algoritam za trazenje prostih jes eratostenovo sito.

Algoritam radi na nacin da ides redom po nekom skupu brojeva, kada naiđeš na broj oznacis ga kao prostog i izbacis sve visekratnike toga broja iz skupa.

Istina je sto je Luuka rekao da to uzima puno memorije, ali dobivas na vremenu.

Nakon sto netko unese N, alociras polje na sljedeci nacin

 

int *A = new int[N+1] // C++

int *A = (int*)malloc( (N+1) * sizeof int )

 

Sve postavis na 1 i pises ostatak algoritma.

 

Evo kod na brzaka, mozda ima gresaka nije testiran ..

 

for ( int i = 2; i <= N; ++i )

  if ( prim[i] )

   for ( int i = 2*i; j <=N; j += i )

    prim[j] = 0;

 

Ovo se naravno moze jos optimizirati po potrebi ....

 

Gore sam ga ja stavio, imam ga implementirana u jednom programu, međutim nedostatak mu je što traži alokaciju polja,

ja sam ga implementirao sa bool poljem, pošto alocira polje na broju 1,3 milijarde na mom stroju dolazi do overflow-a.

Međutim, on brojeve od milijuna izbacuje za tren, i stotine milijuna isto radi brzo, pa ipak kompromisno izgleda prihvatljivije rješenje.

Poruka je uređivana zadnji put ned 27.3.2011 14:48 (Floki).
14 godina
neaktivan
offline
C/C++ program za racunanje N-tog rpostog broja

Mozda bi se moglo probati koristiti stl - set pa ustedjeti na memoriji.

Znam napisati veoma slozenu strukturu bitseta, kojom bi se također moglo uštedjeti na memoriji ...

Trebalo bi probati implementirati .......

 

Nazalost vrijeme bi bilo malo sporije od O(1) :(.

 
0 0 hvala 0
14 godina
neaktivan
offline
Re: C/C++ program za racunanje N-tog rpostog broja

Imam pitanje...napišem ovaj kod: for(i=2; i<=(n-1); i++)
    {
             if(n%i!=0)
             {printf("\nBroj je prost.\n");
             break;
             }
             else
             {printf("\nBroj nije prost.\n");
             break;
             }
    }
    getch();
}

kad unesem neke brojeve uvijek mi program ispiše točno rješenje, ali zašto kad upišem broj 9 ili 99 ispiše da je broj prost...a nije?...

14 godina
neaktivan
offline
Re: C/C++ program za racunanje N-tog rpostog broja
B3Arf00t kaže...

Imam pitanje...napišem ovaj kod: for(i=2; i<=(n-1); i++)
      {
                        if(n%i!=0)
                        {printf("\nBroj je prost.\n");
                        break;
                        }
                        else
                        {printf("\nBroj nije prost.\n");
                        break;
                        }
      }
      getch();
}

kad unesem neke brojeve uvijek mi program ispiše točno rješenje, ali zašto kad upišem broj 9 ili 99 ispiše da je broj prost...a nije?...

 

Ovaj kod je u potpunosti kriv.

1) Ti sigruno loopas samo jednom, jer radis break u oba slicaja, drugim rijecima program govori jeli broj paran ili ne.

2) Ne moras ici do N-1, vec do N / 2 odnosno do sqrt(N) ali to vise manje

 

Ono sto si htio jest ovo :

Broj je prost ako nema niti jednog manjeg od njega da je djeljiv.

 

bool prost = true;

for (int i = 2; i * 2 <= N && prost; ++i) {

  if (N % i == 0) prost = false;

Poruka je uređivana zadnji put pon 28.3.2011 0:20 (Budimir).
1
Nova poruka
E-mail:
Lozinka:
 
vrh stranice