Opgaver i denne lektion   Gå til annoteret slide, hvor denne opgave er tilknyttet -- Tastaturgenvej: 'u'   Alfabetisk indeks   Kursets hjemmeside   

Opgaveløsning:
Goldbachs Formodning


Der findes en video der viser hvordan jeg udvikler programmet.

Løsningen herunder svarer til løsningen, som udvikles i den nævnte video.

#include <stdio.h>
#include <assert.h>
#include "primes.h"

void goldbach(int lower_limit, int upper_limit);
void test_goldbach_for_number(int i);
int odd(int i);
int even(int i);

int main(void) {
  int lower_limit, upper_limit;
  printf("Goldbachs Conjecture: Enter lower and upper limits:\n");
  scanf("%d %d", &lower_limit, &upper_limit);

  goldbach(lower_limit, upper_limit);

  return 0;
}

void goldbach(int lower_limit, int upper_limit){
  int lower_limit_even, i;

  lower_limit_even = odd(lower_limit) ? 
                       lower_limit + 1 : lower_limit;

  for(i = lower_limit_even; i <= upper_limit; i += 2)
    test_goldbach_for_number(i);
}

/* Test goldbach conjecture for i. Either print the sum of primes,
   or a counter example of the conjecture.
   Assume as a precondition that i is even */
void test_goldbach_for_number(int i){
  int n, m, counter = 0;
  assert(even(i));

  for(n = 1; n <= i/2; n += 2){
    m = i - n;
    /* n + m == n + (i - n) == i */
    if (odd(m) && odd(n) && is_prime(n) && is_prime(m) && 
        n > 2 && m > 2){
      printf("%d + %d = %i\n", m, n, i);
      counter++;
    }
  }
  if (counter == 0)
    printf("%d is not composable!!!\n", i);  /* Error in video: missing parameter i */
  printf("\n");
}

int odd(int i){
  return i % 2 == 1;
}

int even(int i){
  return i % 2 == 0;
}