Project Euler: Problem27

f(n) = n*n + an + b, |a|<1000, |b|<1000 である f に対し、 n に 0 から順に代入していったとき、素数が連続して最も長く出現するような a, b の値を求めよ。

こっちもがっちり C で。何も考えなくても Haskell より速い。素敵。

#include <stdio.h>
#define MAX 1000

int isPrime(int x){
  int i;
  for (i=2;i<x;i++)
    if (x%i==0)
      return 0;
  if (x<=1)
    return 0;
  return 1;
}
int euler(int a, int b, int n){
  return n*n+a*n+b;
}

int main(){
  int a,b,n;
  int max_a=0, max_b=0, max_n=0;

  for(a=-MAX+1;a<MAX;a++) {
    for(b=-MAX+1;b<MAX;b++) {
      for(n=0;;n++)
        if (!isPrime(euler(a,b,n)))
          break;
      if (n>max_n) {
        max_n = n;
        max_a = a;
        max_b = b;
      }
    }
  }
  printf("%d,%d:%d\n", max_a, max_b, max_n);

  return 0;
}