Project Euler 23

Project Euler 23。何となくCでやってみたけど、やっぱりRubyのような抽象度の高い言語に比べると面倒だ。

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

#define NUM 10000
#define LIMIT 28123

int isabundant(int n) {
  int sum = 0, ptr = 0;

  for (int i = 1; i <= n / 2; i++) {
    if ((n % i) == 0) {
      sum += i;
    }
  }

  if (sum > n) {
    return 1;
  } else {
    return 0;
  }
}

int main (int argc, char **argv) {
  int n = 1, ptr = 0;
  int sum = 0;
  int abun[NUM];
  int flag[LIMIT];

  while (ptr < NUM && n <= LIMIT) {
    if (isabundant(n)) {
      abun[ptr++] = n;
    }
    n++;
  }

  for (int i = 0; i < LIMIT; i++) flag[i] = 0;

  for (int i = 0; abun[i] <= LIMIT ; i++) {
    for (int j = 0; abun[j] <= LIMIT; j++) {
      if (abun[i] + abun[j] > LIMIT) {
	break;
      }
      flag[abun[i] + abun[j]] = 1;
    }
  }

  /* to see how sparse the flagged area
  for (int i = 0; i < LIMIT; i++) {
    if (flag[i] == 1) {
      printf(".");
    } else {
      printf(" ");
    }
  }
  */ 

  for (int i = 0; i < LIMIT; i++) {
    if (flag[i] == 0) sum += i;
  }

  printf ("answer: %d\n", sum);
  return 0;
}