/* * SPDsoft: perfect numbers */ static char __ident[] = "@(#)(c) SPDsoft, Oct 29 12:23:36"; #define VERS_STR ((char*)&__ident[4]) #include #include #include #include #include #include #define Boolean char #define Float long double #if 0 #define Float double #define PF "%lf%c" #endif #define MAXL 512 void fatalError(char *name,char *str); Boolean get_options(int argc,char *argv[]); void usage(char *name); Boolean perfect(unsigned long int); extern char *optarg; extern int optind,opterr; typedef struct { Boolean verbose; Boolean range; Boolean timestamp; long int n; } pref; pref G_Prefs; void fatalError(char *name,char *str) { fprintf(stderr, "%s: Fatal Error: %s. bye...\n",name,str); exit(-2); } int main(int argc,char *argv[]) { Boolean done=0; unsigned long int i=2, n, last, sum; unsigned long int now, then; time_t timer; get_options(argc,argv); if ( G_Prefs.range ) { for (n=1; n<= G_Prefs.n; n++) { if ( perfect (n) ) { printf("PERFECT %lu\n", n); } if ( G_Prefs.timestamp ) { time(&timer); now= timer / 60; if (now != then ) { fprintf(stderr, "%lu:%s", n, ctime(&timer)); then = now; } } } } else { n=G_Prefs.n; if (perfect(n)) { printf("PERFECT %lu\n", n); return(0); } else return(1); } return(0); } /* ---------------------------------------------------------------*/ Boolean get_options(int argc,char *argv[]) { int opcion; int theError=0; G_Prefs.verbose=0; G_Prefs.range=0; G_Prefs.timestamp=0; G_Prefs.n=1; while ( (opcion=getopt(argc,argv,"hvVrt")) != EOF ) { switch(opcion) { case 'v': G_Prefs.verbose = 1; break; case 'r': G_Prefs.range = 1; break; case 't': G_Prefs.timestamp = 1; break; case 'V': fprintf(stderr,"%s\n",VERS_STR); break; default: usage(argv[0]); } if ( theError!=0) usage(argv[0]); } G_Prefs.n = atol(argv[optind]); return(0); } void usage(char *name) { fprintf(stderr, "usage: %s [-v][-V][-h] n\n" "-c: use custom separators\n" "-v: verbose\n" "-V: version\n" "-h: This text\n", name ); exit(-1); } Boolean perfect(unsigned long int n) { Boolean done=0; unsigned long int i=2, last, sum; if (G_Prefs.verbose) printf("%d\n", 1); last = 1; sum = 1; if ( n == 1) done = 1; while (!done) { if ( n % i == 0 ) { if (G_Prefs.verbose) printf("%lu\n", i); /* n = n / i;*/ if ( i != last ) { if ( i != n ) sum += i; last = i; } if ( n <= 2 * i ) done=1; } i++; } if (G_Prefs.verbose) printf("%lu, %lu\n", n, sum ); if (n == sum ) { if (G_Prefs.verbose) printf("Perfect!\n"); return(1); } return(0); }