View Single Post
Staro 22.08.2009., 19:26   #6
Bubba
E Pluribus UNIX
Moj komp
 
Bubba's Avatar
 
Datum registracije: Oct 2002
Lokacija: M82
Postovi: 6,751
Citiraj:
Autor Pringelzz Pregled postova
#include <stdio.h>
#include <stdlib.h>
main(){
int a,i,br=0;
printf("\nUpisi broj:");
scanf("%d",&a);
for(i=2;i<a;i++)
{
if(a%i==0)
br++;
if(br!=0)
printf("\nBroj nije prost");
else printf("\nBroj je prost");
system("pause");
}}

al ne reagira bas,izbaci cmd kod ispisa rezultata...
"Reagira", ali nazalost prilicno lose.

Evo ti nekoliko opaska:

Opcenito:

- svi recentni C standardi zahtijevaju eksplicitno navodjenje funkcije main, a i opcenito je to prilicno dobra navika. Navedi povratni tip (integer, po standardu) te argument funkcije (u svom slucaju - void).
Code:
int main (void)
. Takodjer, tvoja funkcija main nista ne vraca, iako bi trebala, cak i ovako implicitno navedena. Fali ti return.
- izbjegavaj, osim ako nemas jako dobar razlog, koristenje funkcije system. Ti ga u ovom konkretnom slucaju nemas ni pod razno i kao takva ti je potpuno nepotrebna. Uz sve to, nisi naveo ni potrebnu knjiznicu za tu funkciju - stdlib.h
- kod ti je "na oko" ruzan. Iako je "stil" pisanja koda personalan, tvoj je u svakom slucaju ruzan i necitljiv. Pazi na to, pogotovo ako trazis pomoc u nekom vecem komadu koda.

A sada konkretno, prisao si samom problemu prilicno lose. S matematicke strane, u ovakvom jednostavnom algoritmu dovoljno je da provjeris je li broj prost tako da imas iteracija do njegovog korijena. Ako pak ne zelis implementirati (ili ne smijes) korjenovanje, dovoljno je provjeriti ostatke pri dijeljenju do njegove polovice. Ako mislis da je to trivijalno i nepotrebno, pogledaj ovo (Tualatin 1.4 GHz):
Code:
bubba@korea:~/threads$ time ./a.out
Unesite broj: 2147483647
Broj 2147483647 je prost.

real    0m59.879s
user    0m59.316s
sys     0m0.052s

bubba@korea:~/$ time ./a.out
Unesite broj: 2147483647
Broj 2147483647 je prost.

real    0m0.211s
user    0m0.008s
sys     0m0.000s
U prvom slucaju, provjera je ista tvojoj (do samog broja - 1), dok je u drugom ista provedena samo do korijena tog broja. Pozamasna razlika, jelda?

Programerski, nisi bas usvojio svo to petljanje i ifovanje do kraja. Razmisli o rjesavanjeu na slijedeci nacin; kreni provjeravati ostatke pri dijeljenu u for petlji, pa ako dobijes ostatak 0, broj je djeljiv i nema potrebe provjeravati dalje jer sigurno nije prost. Ako broj kroz citavu petlju ne bude dijeljiv, onda je sigurno prost.

Obrati takodjer paznju da su prosti brojevi po definiciji prirodni, pa mozes koristiti, kako bi povecao opseg provjere, i unsigned intregere.

Pogledaj ovaj kod:

Code:
#include <stdio.h>
int main (void)
{
int broj, i;
printf ("Unesite broj: ");
scanf ("%d", &broj);
for (i = 2 ; i <= broj / 2 ; i++)
if (broj % i == 0)
{
printf ("Broj %d nije prost.\n", broj);
return 0;
}
printf ("Broj %d je prost.\n", broj);
return 0;
}
Odnosno malo rafiniraniju verziju:

Code:
#include <stdio.h>
#include <math.h>
int main (void)
{
unsigned int broj, i;
printf ("Unesite broj: ");
scanf ("%u", &broj);
for (i = 2 ; i <= (int)(sqrt(broj)) ; i++)
if (!(broj % i))
{
printf ("Broj %u nije prost.\n", broj);
return 0;
}
printf ("Broj %u je prost.\n", broj);
return 0;
}
HTH.
__________________
https://2.71828182845904523536028747...966967627.com/

Programer
Rok od dva mjeseca u stvari znači četiri, ali nikako ispod šest.
Bubba je offline   Reply With Quote