Hipoteza goldbacha w C

0

Witam,
mam do napisania program sprawdzający hipotezę goldbacha dla 20 liczb pierwszych.
Napisałem program który wypisuje 20 liczb pierwszych.

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

int pierwsze (int n)
{
int i;
int p=0;

for (i=2; i <= sqrt (n); i++)
if (n % i == 0)
{
p=1;
break;
}
return p;
}

int main ()
{
int n, p, wynik=0;
do {
printf ("Wpisz liczbe naturalna, n>2, \n n= ");
scanf ("%d", &n);
} while (2<n<= 0);

while (wynik<20)
{

p = pierwsze (n);

if (p == 0) 
{
printf("%d \n", n);
wynik++;
}

n++;
}

system ("pause");
return 0;
}
 

Teraz nie wiem czy dobrze zrozumiałem hipotezę goldbacha ale:
mam liczbę pierwsza powiedzmy jest to n=11 z w/w kodu
robię pętle for która sprawdza czy liczba mniejsza od n (czyli od 11) jest liczba pierwsza(przyjmujemy x), jeżeli jest to wtedy ja dodaje do n'a
warunki wyglądają wiec tak

x=pierwsza jeżeli tak -> x<n jeżeli tak -> x+n=y

wtedy wypisuje y jako sprawdzenie hipotezy

Starałem się więc przerobić w/w kod na potrzeby goldbacha ale otrzymuje błąd
iż linijka x+n=y to " invalid lvalue in assignment "

oto kod:

#include <stdio.h>
#include <stdlib.h>
 
int pierwsze2 (int n)
{
int i;
int p=0;

for (i=2; i <= sqrt (n); i++)
if (n % i == 0)
{
p=1;
break;
}
return p;
}
 
 int pierwsze (int n)
{
int i;
int p=0;

for (i=2; i <= sqrt (n); i++)
if (n % i == 0)
{
p=1;
break;
}
return p;
}

int main ()
{
    
int n, p, wynik=0;
do {
printf ("Wpisz liczbe naturalna, n>2, n= ");
scanf ("%d", &n);
} while (2<n<= 0);

while (wynik<20)
{
p = pierwsze (n);

if (p == 0) 
{
 int x, y;
 int p2;
 
 for(x=0; x<n; x++)
 {
  p2=pierwsze2(x);
           if (p2 == 0)
              {
              x+n=y;
              printf("%d \t %d\n", n, y);
              wynik++;
              }
 }
}
n++;
}
system ("pause");
return 0;
}
 
 

Proszę o jakąkolwiek wskazówkę

dziękuje :)

1

w printf zamiast y napisz x+n

0
Xitami napisał(a)

w printf zamiast y napisz x+n

dzięki, działa, dalej już sobie sam poradzę :)

można tu jakoś plusy dawać (dziękować za pomoc?)?

edit
już znalazłem ;)

dla zainteresowanych caly dzialajacy kod
może komuś się przyda

 #include <stdio.h>
#include <stdlib.h>
 
int pierwsze2 (int n)
{
int i;
int p=0;

for (i=2; i <= sqrt (n); i++)
if (n % i == 0)
{
p=1;
break;
}
return p;
}
 
 int pierwsze (int n)
{
int i;
int p=0;

for (i=2; i <= sqrt (n); i++)
if (n % i == 0)
{
p=1;
break;
}
return p;
}

int main ()
{
    
int n, p, wynik=0;
do {
printf ("Wpisz liczbe naturalna, n>2, n= ");
scanf ("%d", &n);
} while (2<n<= 0);

while (wynik<20)
{
p = pierwsze (n);

if (p == 0) 
{
 int x, y;
 int p2;
 
 for(x=3; x<n; x++)
 {
  p2=pierwsze2(x);
           if (p2 == 0)
              {
              printf("%d \t %d \t %d \n", n, x, x+n);
              wynik++;
              }
 }
}
n++;
}
system ("pause");
return 0;
}
 
1

WTF?

int p=0;
 
for (i=2; i <= sqrt (n); i++)
  if (n % i == 0) {
    p=1;
    break;
  }
return p;

O niebo lepsze było by:

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

A jeszcze lepsze byłoby

double gr=sqrt(n);
for (i=2; i <= gr; i++)
  if (n % i == 0)
    return 1;
return 0;
0

Dzięki za podpowiedzi. Jeszcze jestem początkujący w programowaniu, a to teraz zauważyłem ze powinienem tez ten temat dać w dziale newbie.
Czasem wole pisać w takiej pokracznej składni bo wtedy łatwiej mi dojść do sedna problemu jeśli go mam

oto mój trochę rozbudowany programik działający na przedziałach.

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


int liczepierwsze (int n)
{
int i, p;

for (i=2; i <= sqrt (n); i++)
{
if (n % i == 0) return 1;
else return 0;
}
}
 
goldbach()
{
  int n, p, wynik=0, m;
do 
{
printf ("Wpisz liczbe naturalna, n>2, n= ");
scanf ("%d", &n);
printf ("do jakiej liczby sprawdzamy");
scanf("%d", &m);
} while (2<n<= 0);

while (wynik<50)
{
p = liczepierwsze (n);

if (p == 0) 
{
 int x, y;
 int p2;
 
 for(x=3; x<n; x++)
 {
  p2=liczepierwsze(x);
           if (p2 == 0)
              {
                  if(n<m)
                  {
                  printf("%d \t %d \t %d \n", n, x, x+n);
                  }
              wynik++;
              }
 }
}
n++;

}  system("PAUSE");	
  return main();     
}   

blizniacze()
{
int n, p, wynik=0, m;
do {
printf ("Wpisz liczbe naturalna, n>2, \n n= ");
scanf ("%d", &n);
printf ("do jakiej liczby sprawdzamy");
scanf("%d", &m);


} while (2<n<= 0);
 
while (wynik<50)
{
 
p = liczepierwsze (n);
 
if (p == 0) 
{
      if(n<m)
      {
      printf("%d \t %d \n", n, n+2);
      }
wynik++;
}
 
n++;
}
  system("PAUSE");	
  return main();
}           

pierwsze()
{
int n, p, wynik=0, m;
do {
printf ("Wpisz liczbe naturalna, n>2, \n n= ");
scanf ("%d", &n);
printf ("do jakiej liczby sprawdzamy");
scanf("%d", &m);


} while (2<n<= 0);
 
while (wynik<50)
{
 
p = liczepierwsze (n);
 
if (p == 0) 
{
      if(n<m)
      {
      printf("%d \n", n);
      }
wynik++;
}
 
n++;
}
  system("PAUSE");	
  return main();
}



int main()
{
 int choice;
printf("   1. wyznacza liczby pierwsze,   2. wyznacza liczby bliźniacze,   3. sprawdza hipotezę Goldbacha, 4. Exit ");
scanf("%d", &choice);
  
  switch(choice)
  {
  case 1:pierwsze(); break;
  case 2:blizniacze(); break;
  case 3:goldbach(); break;
  case 4:system("PAUSE");   return 0;	 

  }
  system("PAUSE");	
  return 0;
} 

Jakieś pomysły co mógłbym w nim jeszcze zmienić?

pozdrawiam.

0

http://ideone.com/yI3vF

#include <iostream>
#include <bitset>
#include <cmath>

using namespace std;
#define N 1000000
bitset <(N/2+1)> t;
 
int main(){
        int i,j,k,n,pn;
        cin >> n;
        pn= ceil(n * log (n * log (n) ));
	cout << n << "  " << pn << '\n';
        if( pn>N ){ cout << "sorry... " << pn << '>' << N; return 1; }
        for( i=1,k=3; k*k<pn; k+=2,i++) 
                if( !t.test(i) )
                        for( j=(i*i+i)*2; j+j<pn; j += 2*i+1 ) 
                                t.set(j);
        cout << t.size()-t.count()-1 << '\n';
        n--;
        int * p = new int[n];
        for( i=1,j=0; j<n; i++)
        	if( !t[i] )
        		p[j++]=2*i+1;
        //for( i=0; i<j; i++ ) cout << p[i] << ' ';
	cout << "\n   k   |   Pk   |  min   | min/Pk\n";
	cout << "-------+--------+--------+-------\n";
	t.reset();
	t.set(0);
        for( k=0; k<n; k++ ){
        	i=p[k]-4;
		for( j=0; j<=k; j++ )
			t.set((i+p[j])/2);
		for( j=0; t[j]; j++ ) 
			;
		printf("%6d | %6d | %6d |  %0.2f\n", k+2, p[k], j*2+4,(j*2.0+4)/p[k]);
	}
	return 0;
} 

1 użytkowników online, w tym zalogowanych: 0, gości: 1