The Goldbach conjecture is the claim that every double integer greater than 2 can be written as the sum of two prime numbers. It is one of the biggest mathematical problems that cannot be proved.
In the original Goldbach hypothesis, Goldbach claims that every integer greater than 2 can be written as the sum of 3 prime numbers. This claim was put forward with the assumption that the number 1 is the prime number. But now 1 is not a prime number. This claim, which we treat as a Goldbach conjecture, consists of Euler's correction that “every double integer greater than 2 can be written as the sum of two prime numbers".
For example; 4,6,8,10 and 12 numbers can be write as 2 prime number pairs.
4 = 2 + 2
6 = 3 + 3
8 = 3 + 5
10 = 5 + 5
This example C code, which allows a double integer greater than 2 to be written as two prime numbers. E.g. 124620;
124620 = 19 + 124601
#include <stdio.h>
//Function declerations
int is_prime(int n);
void goldbach(int g);
int main(){
int number = 0;
while(1){
printf("Enter even number:");
scanf("%d",&number);
if(number>2 && number%2==0){
goldbach(number);
}
else{
printf("Incorrect number!\n");
}
printf("\n");
}
return 0;
}
//Check is prime number?
int is_prime(int n){
int flag = 1;
for (int j = 2; j < n/2; j++)
{
if((n%j) == 0){
return flag-1;
}
}
return flag;
}
//Goldbach solution of a double integer greater than 2
void goldbach(int g){
int i = 2;
for (int j = g-i; j > 2; j--)
{
if(is_prime(i) == 1 && is_prime(j) == 1)
{
printf("%d = %d + %d\n",g,i,j);
break;
}
i++;
}
}
All two prime pairs. E.g. 16;
16 = 3 + 13
16 = 5 + 11
16 = 11 + 5
16 = 13 + 3
#include <stdio.h>
//Buffer for primes
int primes[100000] = {2};
int j = 0;
//Function declerations
int is_prime(int n);
void goldbach(int g);
int main(){
int number = 0;
while(1){
printf("Enter even number:");
scanf("%d",&number);
if(number>2 && number%2==0){
goldbach(number);
}
else{
printf("Incorrect number!\n");
}
printf("\n");
}
return 0;
}
//Check is prime?
int is_prime(int n){
int flag = 1;
for (int j = 2; j < n/2; j++)
{
if((n%j) == 0){
return flag-1;
}
}
return flag;
}
//Goldbach solutions of a double integer greater than 2.
void goldbach(int g){
int flag = 0;
if(primes[j]<g){
for (int i = primes[j]+1; i < g; i++)
{
if(is_prime(i) == 1){
j++;
primes[j] = i;
}
}
}
for (int i = 0; i < j; i++)
{
for (int k = 0; k < j; k++)
{
if(primes[i] + primes[k] == g){
printf("%d = %d + %d\n",g,primes[i],primes[k]);
break;
}
}
}
}
Top comments (4)
Your code probably does its job (haven't tried it) but I suggest some refactorings:
You can easily avoid the global variables
primesandjby declaring them insidemain. Yes, you will have to pass additional arguments togoldbachbut that's fine.It is hard to understand what the meaning of
jis. You should use a more expressive name likelast_prime_index.In
is_primeyou declare another variablejwhich shadows the globalj. This can easily cause errors.In
is_prime, instead ofj < n/2, you should check ifj <= sqrt(n). This will make your code much more performant for larger numbers.In
is_prime, instead of declaring aflag, you could simply return 0 or 1.In
goldbach, theflagvariable is not used.The
goldbachfunction does two different things, calculation and output. It could be split into two separate functions.You should check if
j < 100000before incrementing it.include
int is_prime(int);
void f(int);
int main()
{
int n;
scanf("%d",&n);
f(n);
}
int is_prime(int a)
{
int i;
for(i=2;i*i<=a;i++)
{
if(a%i==0)
return(0);
if(i*i>a)
return(1);
}
}
void f(int n)
{
int a,b,i,j;
for(i=2;i<=n;i++)
{
a=i;
if(is_prime(a))
{
b=n-a;
}
if(is_prime(b))
{
printf("%d=%d+%d",n,a,b);
break;
}
}
}
this code work with the number 4 and 6
Why the first code doesn't work with the number 4 ?