Citiraj:
Autor Pringelzz
#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).
. 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.