Aiichi Yamasaki's Homepage

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;
}