```    //  N1N2SM.C
//  Author: Peter Meyer
//  Last mod.: 1999-05-19

#include <stdio.h>
#include <math.h>

#define MAX_N 1000

double sm2000 = 29.530589;
double sm3000 = 29.530583;
double min_sm = 29.529;
double max_sm = 29.532;

void main(void)
{
int n1, n2, j, i=0;
double cm, diff_sm2000, diff_sm3000;
int results[1000][3];

printf("\nAverage month = ( n1*29 + n2*30 ) / ( n1 + n2 ) days");
printf("\nSynodic month 2000 = %.6f, synodic month 3000 = %.6f",sm2000,sm3000);
printf("\n\n%5s%5s%6s%6s%12s%12s%12s",
"n1","n2","n1+n2","n2-n1","av. mon.","diff.2000","diff.3000");
for ( n1=1; n1<MAX_N; n1++ )
{
for ( n2=n1; n2<MAX_N; n2++ )
{
cm = ((double)n1*29 + n2*30)/(n1+n2);
if ( cm >= min_sm && cm <= max_sm )
{
//  Eliminate multiples.
for ( j=0; j<i; j++ )
{
if ( !(n1%results[j][1]) && !(n2%results[j][2]) )
break;
}
if ( j == i )
{
diff_sm2000 = (( cm - sm2000 ) * 100 ) / sm2000;
diff_sm3000 = (( cm - sm3000 ) * 100 ) / sm3000;
if ( fabs(diff_sm2000) < 0.0001 || fabs(diff_sm3000) < 0.0001 )
{
printf("\n%5d%5d%6d%6d",n1,n2,n1+n2,n2-n1);
printf("%12f%11f%%%11f%%",cm,diff_sm2000,diff_sm3000);
results[i][1] = n1;
results[i++][2] = n2;
}
}
}
}
}

printf("\n\n%d results obtained.\n",i);
}
```