Osnovni Zadatak - razlika sa i bez petlje?

poruka: 7
|
čitano: 1.569
|
moderatori: Lazarus Long, XXX-Man, vincimus
1
+/- sve poruke
ravni prikaz
starije poruke gore
6 godina
neaktivan
offline
Osnovni zadatak prost broj- razlika sa/bez petlje?

našao sam u nekoj zbirci ovo prvo rješenje,  koje mi se čini bez razloga (?) zakomplicirano sa suvišnim znakovima petlje,

čini mi se da je ovo moje drugo ispod njega jednostavnije a isto točno

 

jesam li nešto previdio i treba li ipak ovo staviti u petlje kao u prvom rješenju?

(program treba odrediti je li uneseni broj prost)

 

rješenje 1 - suvišna petlja?

#include <iostream>
using namespace std;

int main()
{  int n, i;
  bool isPrime = true;

  cout << "unesi broj: ";
  cin >> n;

  for(i = 2; i <= n / 2; ++i)
  {
      if(n % i == 0)
      {
          isPrime = false;
          break;
      }
  }

  if (isPrime)
      cout << "broj je prost";
  else
      cout << "broj NIJE prost";

  return 0;
}

 

 

rješenje 2 - bez petlje - je li ovo točno?

 

#include <iostream>
using namespace std;

int main()
{  int n, i;
  bool isPrime = true;

  cout << "unesi broj: ";
  cin >> n;

  for(i = 2; i <= n / 2; ++i)
      if(n % i == 0) isPrime = false; 


  if (isPrime)
      cout << "broj je prost";
  else
      cout << "broj NIJE prost";

  return 0;
}

Poruka je uređivana zadnji put sub 25.8.2018 21:27 (Tomo22).
 
0 0 hvala 0
10 godina
neaktivan
offline
Re: Osnovni zadatak prost broj- razlika sa/bez pet

If nije petlja vec uvijet te u ovom slucaju nije suvisna jer ce break zaustaviti for petlju od daljnjeg izvrsavanja, to se radi kako bi se program optimizirao. Nema smisla da se for petlja vrti dalje ako je pronasao broj koji zadovoljava uvijet n%i == 0. Takodjer program bi se mogao jos optimizirati tako da for ne ide do n/2 vec do int(sqlrt(n)+1).

16 godina
neaktivan
offline
Osnovni Zadatak - razlika sa i bez petlje?

Ja mislim da je mislio na vitičaste zagrade. Vitičaste zagrade se ne moraju koristiti ako se iza if, for, while, do... piše samo jedna naredba. Ukoliko ih je više potrebno je pisati { i } da se zna što sve spada u taj blok koda. No zbog clean code-a i čitljivosti, preporuka ih je uvijek pisati.

0100001001101111011010100110000101101110
Moj PC  
0 0 hvala 0
6 godina
neaktivan
offline
Osnovni Zadatak - razlika sa i bez petlje?

znači radi preglednosti svejedno staviti vitičaste bez obzira što je samo jedna naredba, ok

 

a da se ne izvršava petlja onda mogu dodati ovako, onda ne treba break - ovo mi se čini bolje?

 

tnx

 

 

 

#include <iostream>
using namespace std;

int main()
{  int n, i;
  bool isPrime = true;

  cout << "unesi broj: ";
  cin >> n;

  for(i = 2; i <= n / 2 && isPrime== true; ++i)
      if(n % i == 0) isPrime = false; 


  if (isPrime)
      cout << "broj je prost";
  else
      cout << "broj NIJE prost";

  return 0;
}

 

 
1 0 hvala 0
15 godina
offline
Re: Osnovni Zadatak - razlika sa i bez petlje?

Možeš to napisati i ovako: 

 

 

#include <iostream>
using namespace std;

int main()
{  int n, i;
  bool isPrime = true;

  cout << "unesi broj: ";
  cin >> n;

  for (i = 2; i <= n / 2 && (isPrime = !(n % i == 0)); ++i);

  if (isPrime)
      cout << "broj je prost";
  else
      cout << "broj NIJE prost";

  return 0;
}

 

Ali to baš i ne pomaže čitljivosti, a kompajler će sva ta tri vjerojatno slično izoptimizirati.

 

Da se to još "poružniti" :)

14 godina
neaktivan
offline
Osnovni Zadatak - razlika sa i bez petlje?

Ne znam šta ti je komplikovano, ali broj je prost ako je djljiv sam sa sobom i sa 1 samo. To jeste u dva slučaja, koliko god gledao taj kod nešto mi "bode" oči i izgleda komplikovan.

Bar ovo je moj neki primjer, imaš taj broj prodješ for petljom i postaviš brojač da ti izbroji koliko puta je taj broj djeljiv od početka intervala do njega samog. Da bi bio prost mora biti dva puta tj. uzmi primjer broj 7, djeljiv je sa 1 i sa 7. Prost je. Brojač svaki put kad je modul jednak nuli, povećava brojač za jedan. Na kraju ga provjeriš sa if uvjetom umjesto tog tipa bool, gledas brojac==2. 

 

#include <iostream>

using namespace std;

int main()
{  int n;
  int brojac=0;

  cout << "unesi broj: ";
  cin >> n;

  for(i = 1; i <= n ;i++)
    if(n%i==0)

      brojac++;


  if (brojac==2)
      cout << "broj je prost";
  else
      cout << "broj NIJE prost";

  return 0;
}

m4ki
 
0 0 hvala 0
7 godina
neaktivan
offline
Re: Osnovni zadatak prost broj- razlika sa/bez pet

Iako dobivaš isti rezultat nije isto. U prvom primjeru petlja se prestane izvršavati kad shvati da broj nije prost, u drugom se petlja izvrši do kraja. Testiraj ovako npr.

za prvi primjer.

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

cout<<i<<endl

      if(n % i == 0)
      {
          isPrime = false;
          break;
      }
  }

Za drugi primjer:

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

  cout<<i<<endl
      if(n % i == 0) isPrime = false; 

 

}

 

i vidjet češ razliku. Ili još bolje ubaci neki broj za testiranje i ako možeš usporedi brzinu izvršavanja.

 

Ako hočeš još veću brzinu mislim da je ovo najjednostavnije ubrzanje. 

 

for(i = 3; i <= int(sqrt(n)) + 1 ; i=i+2)
  {

cout<<i<<endl

      if(n % i == 0)
      {
          isPrime = false;
          break;
      }
  }

zato jer znaš da parni broj sigurno nije primarni.

 

EDIT: Nešto sam gore zeznuo . Uglavnom ako broj završava s 0101 ili 0001 (binarno) broj sigurno nije prost osim .....  i nema ga smisla testirati  

Poruka je uređivana zadnji put ned 9.9.2018 20:41 (andrijam).
1
Nova poruka
E-mail:
Lozinka:
 
vrh stranice