[c++] Liczby pierwsze

[c++] Liczby pierwsze
MitS
  • Rejestracja:ponad 20 lat
  • Ostatnio:ponad 17 lat
0

Mam drobny problem z pokazywaniem liczb pierwszych do określonej granicy wpisanej przez użytkownika. Mam taki kod:

Kopiuj
 int lp;
 int x = 1;
 int y;
 int do;

cout << "Wpisz granicę liczb pierwszych: ";
cin >> do;
cout << endl;

  if (lp == lp/x & lp == x/y)
  {
         for(lp = 3; lp <= do; lp++)
         {
           cout << lp << endl;        
         }    

}

Ale on jest zły i był bym wdzięczny za podanie mi dobrego lub poprawienie tego.


MitS
KZ
  • Rejestracja:około 22 lata
  • Ostatnio:ponad 14 lat
0

Witam!

Nie wiem czy dobrze rozumiem ale to chyba nie jest całość kodu. A co do błędów to wydaje mi się :

  1. Słowo
Kopiuj
do

jest zastrzeżone i nie można go używać jako nazwy zmiennej
2.Nie widzę tu nigdzie na początku inicjalizacji "lp" i "y" także przy dzieleniu przez "y" ??? ale możliwe że robisz to gdzieś wcześniej rzuć więcej kodu..
3. Operator

Kopiuj
&

to operator bitowy a z tego co rozumiem to tobie raczej chodziło o &&

Kopiuj


pozdr. kain_z
Kapustka
  • Rejestracja:ponad 22 lata
  • Ostatnio:2 miesiące
0

Jest jeszcze błąd w samym pomyśle na algorytm
Twoje rozwiązanie ma konstrukcję:

if
for

i złożoność obliczeniową O(n) co jest podejrzanie szybko gdyż typowe rozwiązanie ma złożoność obliczeniową rzędu O(n^2) oraz schemat:

for
for
if

Szczegóły (nie kompilowałem) :

Kopiuj
for (lp=1;lp<=granica;lp++)
  for (x=2;x<lp;x++) {
    if (!lp%x) break;
    if (x==lp-1) cout<<lp<<endl;
  }

... a jaką złożoność obliczeniową ma najlepsze rozwiązanie ?
pozdrawiam

gesiek20
  • Rejestracja:ponad 20 lat
  • Ostatnio:prawie 18 lat
  • Postów:57
0
MitS napisał(a)

Mam drobny problem z pokazywaniem liczb pierwszych do określonej granicy wpisanej przez użytkownika. Mam taki kod:

Kopiuj
 int lp;
 int x = 1;
 int y;
 int do;

cout << "Wpisz granicę liczb pierwszych: ";
cin >> do;
cout << endl;

  if (lp == lp/x & lp == x/y)                   // ten warunek jest nie do przyjecia brak wartosci poczatkowej 
                                              lp  spowoduje ze glupoty ci wyjda
  {
         for(lp = 3; lp <= do; lp++)
         {
           cout << lp << endl;        
         }    

}

Ale on jest zły i był bym wdzięczny za podanie mi dobrego lub poprawienie tego.

w ogóle to wez sprecyzuj co chcesz osiagnac to zobacze co sie da zrobic


To Like What You Have Is To Have What You Like
Jedyne co mam to złudzenia, ze mogę mieć pragnienia, bo Ta, która wiecznie zawodzi, wiecznie też jest przedmiotem nadziei. Najbardziej odczujesz tego brak gdy będzie obok i nigdy nie będzie Twoja.
MitS
  • Rejestracja:ponad 20 lat
  • Ostatnio:ponad 17 lat
0

Chodzi mi o to że chcĘ by program wypisał mi wszystkie liczby pierwsze do pewnej granicy np. 200.

liczba pierwsza to liczba, która dzieli się przez jeden i samą siebie.

Niestety kod poniższy wypisuje mi wszystkie liczby od 1 do 200

Kopiuj

int lp;
int x;
int y;
int do1; 
 
cout << "Wpisz granicę liczb pierwszych: ";
cin >> do1;
cout << endl;
 
 for (lp = 1; lp <= do1; lp++)
 for (x = 2; x < lp; x++) 
 {
 if (!lp%x) 
 break;
 if (x==lp-1) 
 cout << lp << endl;
 
 
 
} 

A jak zrobić by wypisywał tylko pierwsze czyli np. 1, 3, 5, 7, 13, 17 itd .. ??


MitS
BąQ
  • Rejestracja:około 20 lat
  • Ostatnio:ponad 15 lat
0

Napisałem kod w samym C wypisujący liczby pierwsze oto on:
#include<stdio.h>

int n,i,a;

int main()
{
printf("Podaj granice liczb pierwszych\n");
scanf("%d",&n);
if(n==1)
{
printf("1");
return 0;
}
if(n==0)
{
return 0;
}
if(n>1)
{
printf("1,");
i=2;
for(i=2;i<=n;i++)
{
for(a=2;a<=i;a++)
{
if((a!=i)&&((i%a)==0))
{
break;
}
if(a==i)
{
printf("%d, ",i);
}
}
}
return 0;
}
}

gesiek20
  • Rejestracja:ponad 20 lat
  • Ostatnio:prawie 18 lat
  • Postów:57
0

Leć po falszke

Kopiuj
//---------------------------------------------------------------------------
#include <iostream>
#include <conio.h>
#include <math.h>

bool pierwsza(int k)
{
int dzielnik;
dzielnik=2;
  while (  ((k % dzielnik) != 0) && ((dzielnik <= sqrt(k))) )
    dzielnik++;

  if (dzielnik>sqrt(k))
    return true;
    return false;
}
//---------------------------------------------------------------------------
using namespace std;

int main(int argc, char* argv[])
{
bool hm;
cout<<"Przedzial  <1;200> tak jak chciales\n";

for(int w=1;w<200;w++)
   {
   hm=false;
   hm=pierwsza(w);
   if(hm)  cout<<w<<" ";
   }
   getch();
   return 0;
}
//---------------------------------------------------------------------------

To Like What You Have Is To Have What You Like
Jedyne co mam to złudzenia, ze mogę mieć pragnienia, bo Ta, która wiecznie zawodzi, wiecznie też jest przedmiotem nadziei. Najbardziej odczujesz tego brak gdy będzie obok i nigdy nie będzie Twoja.
Kapustka
  • Rejestracja:ponad 22 lata
  • Ostatnio:2 miesiące
0

faktycznie ... warunek

Kopiuj
if(!lp%x)

nie zadziałał tak jak tego oczekiwałem i po zmianie wszystko jest *prawie ok:

Kopiuj
for (lp=1;lp<=granica;lp++)
  for (x=2;x<lp;x++) {
    if (lp%x==0) break;
    if (x==lp-1) cout<<lp<<endl;
  }

pozdrawiam
*dwójka nie jest wyświetlana ale proponuję to obsłużyć przed pętlą

EM
  • Rejestracja:ponad 20 lat
  • Ostatnio:ponad 19 lat
0
Kapustka napisał(a)

warunek

Kopiuj
if(!lp%x)

nie zadziałał tak jak tego oczekiwałem

No a nie zadzialal bo powiinno byc if(!(lp%x))

MitS
  • Rejestracja:ponad 20 lat
  • Ostatnio:ponad 17 lat
0

Dzięki gesiek20 oto mi chodziło :)

twój kod BąQ też działa ...

Kiedyś się odwdzięczę ;P ;P ;P


MitS
vixen03
  • Rejestracja:ponad 21 lat
  • Ostatnio:prawie 14 lat
  • Postów:475
0

a nie latwiej zastosowac sito erastotenesa?


Mr P
  • Rejestracja:prawie 21 lat
  • Ostatnio:prawie 18 lat
0

A jak zrobić by wypisywał tylko pierwsze czyli 1, 3, 5, 7, 13, 17 itd

1 nie jest liczbą pierwszą, za to 2 nią jest ;) .</quote>


<font color="darkblue">"Dopóki rozumiemy kontekst, który mocno wyprzedza teraźniejszość, teraźniejszość jest najbardziej trywialnym pojęciem w tym kontekście." Bill Gates

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.