Skocz do zawartości
dj_tej

[c] Obliczanie Liczb Pierwszych Metoda Sita

Rekomendowane odpowiedzi

mam pewien problem z tym programem do obliczania liczb pierwszych metoda sita.... daje wartosc zmiennej wieksza niz 9 i program sie wysypuje...

 

oto kod:

#include <stdio.h> #include <conio.h>int main () { int N; int x, i, k=0, t[N+1], t2[2]={2, 3, 5}; printf("\nProgram wyznacza liczby pierwsze do podanej granicy"); printf("\nPodaj gorna granice:\n"); printf("N="); scanf("%d",&N); 			  for(i=0; i<=N; i++)			  t[i]=1;for (i=2; i<=N; i++){	if(i%t2[k]==0)	{				  t[i]=0;				  k++;	}}for (i=2; i<=N; i++)	{	if (tab1[i]>0) 	printf(" %d ", i); 	}getch();return 0; }

dzieki z gory za pomoc

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Witam

 

Co prawda slabo sie znam na programowaniu ale wydaje mi sie ze zle deklarujesz zmienne. Dlatego ze w momecie deklaracji program nie zna N, skoro nie zna N to jak moze dobrze zadeklarowac t[N] ??

 

Jest jeszce jeden problem. Twoj algorytm wytnie 2, 3 i 5 a tez to sa liczby pierwsze. Pozatym Twoj algorytm sprawdza jedynie %2 dlatego ze if to nie jest petla i nie zwieksza K. Powinno chyab byc tak:

for (i=2; i<=N; i++){		for (k=0; k<=2; k++)	if((i%t2[k])==0)	{				  t[i]=0;				  	}}
Edytowane przez jezol

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

jezol z towimi poprawkami tak czy inaczej program sie wysypuje... a co do deklaracji zmeinnych to wydaje mi sie ze to jest poprawny zapis... wczesniej tez tak deklarowalem zmeinne i nie byl oz tym problemow wiec sadze ze to nie to

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

A to ciekawe czemu sie wysypuje. Ogolnie u mnie jak wkleilem Twoj kod to w ogole nie chcial sie skompilowac. Uzywam Dev-c++. Gdy ustawilem na sztywno wielkosc tablicy to sie kompiluje. Jeszcze sie nie chcial skompilowac bo gdzies bylo Tab1 a nie zadeklarowales takiej tablicy.

 

Wklejam kod ktory u mnie dziala.

#include <stdio.h> #include <conio.h>int main () { int N,i,k; int t[10000];int t2[3]={2, 3,5};printf("\nProgram wyznacza liczby pierwsze do podanej granicy"); printf("\nPodaj gorna granice:\n"); printf("N="); scanf("%d",&N); for (i=0; i<=N; i++)	t[i]=1;for (i=2; i<=N; i++){		for (k=0; k<=2; k++)	if((i%t2[k])==0)	{				  t[i]=0;				  	}}t[0]=0;t[1]=0;t[2]=1;t[3]=1;t[5]=1;for (i=0; i<=N; i++)	if (t[i]!=0) printf("%d-%d   \n", i,t[i]);getch();return 0; }

Program wypisuje kazda liczbe w nowej lini. I po "-" sa jedynki jako ze w tablicy sa wartosci 1. Zrobilem to kontrolnie bo przez jakis czas mialem jakies smieci zamiast ostatniej liczby. teraz jest wszystko si. tylko rozwiazanie 2,3 i 5 troche zrobione na odczepne, ale dziala.

 

Pozdrawiam

Edytowane przez jezol

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

tez uzywam dev cpp... zmienialem nazwe tablicy i gdzies przeoczylem dlatego nie byla zdeklarowana... a co do rozmiaru tablicy to nie bede sie klocil bo jestem poczatkujacy puki co ;)

 

dzieki wielkie za pomoc :)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Algorytm może się kończyć wcześniej tj. dla N = sqrt(N) pod warunkiem, że wykosi się wielokrotności 2.

 

#pragma hdrstop#include <stdio.h>#include <conio.h>#include <math.h>#define Step 2#pragma argsusedint key(){   printf("\n\nNacisnij dowolny klawisz!");   getch();   return 0;}int main(int argc, char **argv){   int Ru = 100, Rl = 0;      printf("Podaj dolny zakres: ");   scanf("%d", &Rl);      printf("Podaj gorny zakres: ");   scanf("%d", &Ru);   Ru++;      if (Rl > Ru || Rl < 0 || Ru < 1) {	  printf("\n\nNieprawidlowy zakres!!!\n\n");	  key();	  return 0;   }      printf("\nZakres: %d - %d\n\n", Rl, Ru - 1);      char *P;    P = new char[Ru];      if (NULL != P) {   	printf("Poczatek algorytmu...\n\n");		unsigned int I, Number, F = (int)(sqrt(Ru - 1));		P[0] = 0;	P[1] = 0;	P[2] = 1;   	for (I = 3; I < Ru; I += Step)		P[I] = 1;	for (I = 4; I < Ru; I += Step)		P[I] = 0;	for (I = 3; I <= F; I += Step)		 for (Number = I * I; Number < Ru; Number += Step * I)			   if (P[Number]) P[Number] = 0;				  	printf("Koniec algorytmu...\n\n");			  	unsigned int Count = 0;		for (I = Rl; I < Ru; I++)		if (P[I]) Count++;			printf("Znaleziono: %d\n\n", Count);		if (Count) {	   printf("Wypisac liczby pierwsze (0 = Nie)? ");	   int d;	   scanf("%d", &d);	   if (d) {	   printf("\n\n");	   for (I = Rl, Number = 1; I < Ru; I++)		   if (P[I]) {printf("#%d:  %d\n", Number, I); Number++;}	   }	}   }      key();   return 0;}
Edytowane przez Dj_AnT

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

A od siebie dodam deklaracja tablicy n-elementowej:

int n;int *tablica;[pobieramy tu n, np scanfem]tablica=malloc(n*sizeof(int));

Mogłem coś troszkę pomieszać z głowy pisałem a nie mam jak sprawdzić. W każdym razie należy użyć malloc() ;)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Ja musze zrobić podobny program, do tego tylko ma obliczać liczby doskonałe mój algorytm wygląda tak:

#include<iostream> #include<cmath>  using namespace std; long long int N, Np, a, s;  int main() {  cout << "Liczba: "; cin>>N;  Np = N/2;  for(a=1; a <= Np; a++){ if (!(N%a)) s+=a; } if(s==N)cout<<"Yes"; else cout<<"No";  cin.ignore(); getchar(); }
Ale nie wiem jak napisać lub połaczyć to z tym programem aby użytkownik wpisał dolną i górną granice przedziału a program wypisał które liczby z przedziału sę doskonałymi. Jeśli ktoś zechcę pomóc niech napisze. Edytowane przez kaspertk

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Gość
Dodaj odpowiedź do tematu...

×   Wklejono zawartość z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić grafiki. Dodaj lub załącz grafiki z adresu URL.

Ładowanie


×
×
  • Dodaj nową pozycję...