c++ liczby pierwsze

x_x_x
Użytkownik
Użytkownik
Posty: 46
Rejestracja: 27 maja 2007, o 20:51
Płeć: Mężczyzna
Lokalizacja: Bartoszyce
Podziękował: 1 raz
Pomógł: 4 razy

c++ liczby pierwsze

Post autor: x_x_x »

robię zadanie z liczbami pierwszymi PRIME_T na spoju. Program ma za zadanie wczytać n liczb a następnie wypisać TAK dla liczb pierwszych i NIE jeśli liczba jest złożona. Sprawdzałem mój programik i działa bez problemu do n=100 (dalej nie sprawdzałem bo nei znam wszystkich liczb pierwszych) zatem powinien raczej działać dobrze jednak ciągle przy wysyłaniu rozwiązania wyskakuje mi błąd że błędna odpowiedź... Wie ktoś może co jest nie tak z tym programem??

Kod: Zaznacz cały

#include <iostream>
#include <math.h>
using namespace std;


int main(){
    unsigned int ile;
    cin >> ile; unsigned int liczby[ile];
    for(unsigned int i=0;i<ile;++i){
            cin >> liczby[i];
            
            }
    
    for(int i=0;i<ile;++i){

            int czy_pierwsza=1;
            if(liczby[i]==1) {czy_pierwsza=0;}
            else if(liczby[i]==2) czy_pierwsza=1;
            else if(liczby[i]>2){
                 for(unsigned int j=2;j<=sqrt(liczby[i]);++j){
                         if(liczby[i]%j==0) {czy_pierwsza=0; break;}
                         else czy_pierwsza=1;
                         }
                 }
                 if(czy_pierwsza) cout << "TAK";
                 else cout << "NIE";
            }
            }    

Xitami

c++ liczby pierwsze

Post autor: Xitami »

Odpowiedzi mają być chyba w oddzielnych wierszach.
x_x_x
Użytkownik
Użytkownik
Posty: 46
Rejestracja: 27 maja 2007, o 20:51
Płeć: Mężczyzna
Lokalizacja: Bartoszyce
Podziękował: 1 raz
Pomógł: 4 razy

c++ liczby pierwsze

Post autor: x_x_x »

Xitami pisze:Odpowiedzi mają być chyba w oddzielnych wierszach.
Próbowałem już tak

Kod: Zaznacz cały

if(czy_pierwsza) cout << "TAK
";
                 else cout << "NIE
";
i również tak

Kod: Zaznacz cały

if(czy_pierwsza) cout << "TAK" << endl;
                 else cout << "NIE" << endl;
nawet próbowałem aby wypisywało te tak lub nie zaraz po sprawdzeniu czy liczba jest ierwsza tzn. program składał się z jednej pętli i dalej cosik nie tak
Xitami

c++ liczby pierwsze

Post autor: Xitami »

Zero nie jest liczbą pierwszą!
matshadow
Użytkownik
Użytkownik
Posty: 941
Rejestracja: 17 gru 2007, o 21:48
Płeć: Mężczyzna
Lokalizacja: Kingdom Hearts
Podziękował: 6 razy
Pomógł: 222 razy

c++ liczby pierwsze

Post autor: matshadow »

Odpowiedź jest prosta:
a) Ile się uczysz C++? Mniemam że jesteś początkujący, bo takie coś jest niedopuszczalne

Kod: Zaznacz cały

unsigned int ile;
    cin >> ile; unsigned int liczby[ile];
Jak chcesz taką metodą, to poczytaj o tablicach dynamicznych
b) Problem tkwi w Twoim algorytmie, który nie działa dla wszystkich liczb. Poszukaj Sito Eratostenesa
c) Każda odpowiedź musi się kończyć znakiem nowej linii
Dumel
Użytkownik
Użytkownik
Posty: 2000
Rejestracja: 19 lut 2008, o 17:35
Płeć: Mężczyzna
Lokalizacja: Stare Pole/Kraków
Podziękował: 60 razy
Pomógł: 202 razy

c++ liczby pierwsze

Post autor: Dumel »

jak nie chcesz uzywac tablic dynamicznych to mozesz uzyc kontenera vector
turkiSh
Użytkownik
Użytkownik
Posty: 31
Rejestracja: 3 lut 2009, o 16:14
Płeć: Mężczyzna
Podziękował: 6 razy
Pomógł: 1 raz

c++ liczby pierwsze

Post autor: turkiSh »

Nienajszybszy algorytm, ale rozwiazuje te zadanie

Kod: Zaznacz cały

      #include <cstdlib>
      #include <iostream>

      using namespace std;


      int a,b,t;

      int main()
      {
      cin>>t;
      for (int i = 1;i<=t; i++)
      {
      cin>>b;
      if (b==1) b=4;
      if(b==2) b = 3;
      for (int j = 2;j<=b-1; j++)
      {
      a=b % j;
      if (a == 0)
      {
      cout<<"NIE"<<endl;

      break;

      }
      }
      if (a != 0) cout<<"TAK"<<endl;

      }

      system("PAUSE");

      }
x_x_x
Użytkownik
Użytkownik
Posty: 46
Rejestracja: 27 maja 2007, o 20:51
Płeć: Mężczyzna
Lokalizacja: Bartoszyce
Podziękował: 1 raz
Pomógł: 4 razy

c++ liczby pierwsze

Post autor: x_x_x »

matshadow pisze:Odpowiedź jest prosta:
a) Ile się uczysz C++? Mniemam że jesteś początkujący, bo takie coś jest niedopuszczalne

Kod: Zaznacz cały

unsigned int ile;
    cin >> ile; unsigned int liczby[ile];
Jak chcesz taką metodą, to poczytaj o tablicach dynamicznych
b) Problem tkwi w Twoim algorytmie, który nie działa dla wszystkich liczb. Poszukaj Sito Eratostenesa
c) Każda odpowiedź musi się kończyć znakiem nowej linii


co do tablic dynamicznych to jeszcze nie mam ich opanowanych więc zrobiłem tak jak zrobiłem (choć to pewnie wynika z tego - jak zauważyłeś - że zbyt wielkiej biegłości w programowaniu nie mam) a co Twoim zdaniem jest nie tak z algorytmem?? Jest to jeden z prostszych (do zaimplementowania) algorytmów sprawdzających czy dana liczba liczba jest pierwsza?? Po prostu sprawdza czy dana liczba jest podzielna przez jakąkolwiek liczbę naturalną z przedziału \(\displaystyle{ [2,\sqrt{x}]}\) o ile \(\displaystyle{ x>2}\)
ostatnio coś przypadkiem poprawiłem i z tym samym algorytmem przeszło bez problemu
co do kończenia się odpowiedzi znakiem linii to już wspomniałem że dawałem cout << "TAK
"; i dalej wywalało błąd ...

Xitami pisze:Zero nie jest liczbą pierwszą!
a gdzie ja twierdziłem że zero jest liczbą pierwszą??
matshadow
Użytkownik
Użytkownik
Posty: 941
Rejestracja: 17 gru 2007, o 21:48
Płeć: Mężczyzna
Lokalizacja: Kingdom Hearts
Podziękował: 6 razy
Pomógł: 222 razy

c++ liczby pierwsze

Post autor: matshadow »

Algorytm nie jest zły, ale jak już mówiłem, nie wyrobi się dla dużych liczb. Dlatego ja w takich problemach zawsze stosuję Sito Eratostenesa.
Awatar użytkownika
Mariusz M
Użytkownik
Użytkownik
Posty: 6909
Rejestracja: 25 wrz 2007, o 01:03
Płeć: Mężczyzna
Lokalizacja: 53°02'N 18°35'E
Podziękował: 2 razy
Pomógł: 1246 razy

c++ liczby pierwsze

Post autor: Mariusz M »

Oto prosta implementacja sita Eratostenesa
oczywiście można jeszcze ją usprawnić a
napisałem ją w C

Kod: Zaznacz cały


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

int main(){
int i,j,n;
int* b;
FILE* fp;
char ch;
do{
printf("Podaj n=");
scanf("%d",&n);
b=(int*)malloc((n+1)*sizeof(int));

for(i=0;i<=n;i++)
b[i]=0;

for(i=2;i<=n;i++){
for(j=i+i;j<=n;j+=i){
b[j]=1;
}
if(b[i]==0) 
printf("%10d",i);
}
printf("
");

if((fp=fopen("sieve.txt","w"))==NULL){
printf("Nie mozna otworzyc pliku do zapisu 
");
exit(1);
}
j=0;
for(i=2;i<=n;i++){
if(b[i]==0){
fprintf(fp,"%10d",i);
j++;
}
if(j%10==0&&b[i]==0) fprintf(fp,"
");
}
fprintf(fp,"
");
free(b);
fclose(fp);
ch=getchar();
}
while(ch!=27);
return 0;
}

Ostatnio zmieniony 27 mar 2009, o 23:19 przez Mariusz M, łącznie zmieniany 1 raz.
matshadow
Użytkownik
Użytkownik
Posty: 941
Rejestracja: 17 gru 2007, o 21:48
Płeć: Mężczyzna
Lokalizacja: Kingdom Hearts
Podziękował: 6 razy
Pomógł: 222 razy

c++ liczby pierwsze

Post autor: matshadow »

nie przejdzie na spoju, bo program używa plików zewnętrznych. Oczywiście jest krótsza metoda, choćby na Wikipedii
Awatar użytkownika
Mariusz M
Użytkownik
Użytkownik
Posty: 6909
Rejestracja: 25 wrz 2007, o 01:03
Płeć: Mężczyzna
Lokalizacja: 53°02'N 18°35'E
Podziękował: 2 razy
Pomógł: 1246 razy

c++ liczby pierwsze

Post autor: Mariusz M »

matshadow pisze:nie przejdzie na spoju, bo program używa plików zewnętrznych. Oczywiście jest krótsza metoda, choćby na Wikipedii
Używa plików ale tylko do zapisywania wyników
Poza tym łatwo usunąć możliwość zapisywania do pliku
matshadow
Użytkownik
Użytkownik
Posty: 941
Rejestracja: 17 gru 2007, o 21:48
Płeć: Mężczyzna
Lokalizacja: Kingdom Hearts
Podziękował: 6 razy
Pomógł: 222 razy

c++ liczby pierwsze

Post autor: matshadow »

Nie da się zaprzeczyć
ODPOWIEDZ