c4.code1
a program for computing Ulam numbers (simple method)
This is a C program for computing Ulam numbers.
#include <stdio.h>
#include <stdlib.h>
#define MAX 40000000
int v[MAX+1],u[MAX],a[MAX];
int int_comp(const void *_a, const void *_b)
{
int *a = (int *)_a;
int *b = (int *)_b;
return *a-*b;
}
int main()
{
int i,j,c,d,e,m=0,s;
FILE *fop,*fip;
for(i=0;i<=MAX;i++)
v[i]=0;
for(i=0;i<MAX;i++)
u[i]=0;
for(i=0;i<MAX;i++)
a[i]=0;
u[0]=1;
u[1]=2;
c=2;
v[3]=1;
for(i=3;i<=MAX;i++){
if(v[i]==1){
for(j=0;j<c;j++){
if(i+u[j]>MAX)
break;
v[i+u[j]]++;
}
u[c++]=i;
}
}
fop=fopen("U-num.dat","w");
for(i=0;i<c;i++){
fprintf(fop," %d \n",u[i]);
}
fclose(fop);
fop=fopen("U-num.123.dat","w");
for(i=0;i<c-1;i++){
s=u[i]+u[i+1];
if(bsearch(&s,u,c,sizeof(int),int_comp)!=NULL){
fprintf(fop," %d + %d = %d \n",u[i],u[i+1],s);
}
}
fclose(fop);
fop=fopen("U-num.nonsum.dat","w");
for(i=3;i<=MAX;i++){
if(v[i]==0){
fprintf(fop," %d \n",i);
}
}
fclose(fop);
fop=fopen("U-num.consecutive.dat","w");
for(i=0;i<c-1;i++){
if(u[i]+1==u[i+1]){
fprintf(fop,"( %d , %d )\n",u[i],u[i+1]);
}
}
fclose(fop);
fop=fopen("U-num.gap.dat","w");
for(i=0;i<c-1;i++){
d=u[i+1]-u[i];
if(a[d]++==0){
fprintf(fop," %d \t %d \n",d,u[i]);
}
}
fclose(fop);
fop=fopen("U-num.gapcount.dat","w");
for(i=1;i<MAX;i++){
if(a[i]>0){
fprintf(fop," %d \t %d \n",i,a[i]);
}
}
fclose(fop);
fop=fopen("U-num.maxgap.dat","w");
fip=fopen("U-num.gap.dat","r");
while(fscanf(fip," %d \t %d ",&d,&e)!=EOF){
if(d>m){
m=d;
fprintf(fop," %d \t %d \n",d,e);
}
}
fclose(fip);
fclose(fop);
return 0;
}