/****************************************************************************/ /* Numeros de Ulam: los primeros numeros de Ulam son el 1 y el 2, */ /* cualquier otro entero positivo es un numero de Ulam si y solo si */ /* puede escribirse de una sola manera como suma de numeros de Ulam */ /* diferentes. */ /* */ /* Jaime Suarez <mcripto@bigfoot.com> 2003 */ /* en http://elparaiso.mat.uned.es */ /****************************************************************************/ #include <stdio.h> main(int argc, char *argv[]) { long *ulam; int formas; long n,i,j,encontrados=2,max; /* Leer linea de argumentos */ if (argc!=2) { printf("ulam <n> , escribe los n primeros números de Ulam.\n"); return 1; } max=atol(argv[1]); /* Reserva memoria para el array */ ulam=(long *)malloc(max*sizeof(long)); /* Inicializar */ ulam[0]=1; ulam[1]=2; n=3; printf("%8d --> %8d\n",1,1); printf("%8d --> %8d\n",2,2); /* Ciclo principal */ while (encontrados<max) { formas=0; /* Basta con buscar hasta la mitad de n */ for (i=0; i<encontrados && 2*ulam[i]<n; i++) for (j=i+1; j<encontrados; j++) { if (n == ulam[i]+ulam[j]) formas++; if (formas>1) break; } /* Si solo se escribe de una forma, entonces nos vale */ if (formas==1) { ulam[encontrados]=n; printf("%8d --> %8d\n",++encontrados,n); } n++; } return; }