/* Written by Jens Kruse Andersen */ /* Search vampire numbers (not prime) */ #include #include #include #include #if 1 typedef unsigned __int64 int64; /* Borland C++ 64 bit int - note two underscores*/ #else typedef unsigned long long int64; /* 64 bit int = long long in 1999 standard C? */ #endif /* intn should be unsigned at least n-bit integer */ typedef unsigned char int8; typedef unsigned int int16; typedef unsigned long int32; typedef unsigned int intf; /* intf = fastest int at least 16 bit */ typedef int32 digtype; #define million 1000000 #define digitmax 1000000 #define digitsmax 6 digtype dig[digitmax+1]; int64 dig64[digitmax+1]; void initdigit(void) { int32 d,i,d0,digit; int64 dsquare; fprintf(stderr, "Initdigit.."); for (d=0;d=(int64)maxd*maxd/10) mine=d; else mine=(int64)maxd*maxd/10/d; if (emod9[d%9]==10) continue; mine+= ((emod9[d%9])-(mine%9)+9)%9 -9; step=9*d; step0=step%power10; step1=step/power10; de=(int64)d*mine; de0=de%power10; de/=power10; de1=de%power10; de2=de/power10; e0=mine%power10; e1=mine/power10; digd=dig[d]; dige1=dig[e1]; digd_e1=digd+dige1; digde2=dig[de2]; digd_e1_sub_digde2=digd_e1-digde2; for (e=mine+9; e=power10) { e0-=power10; digd_e1=digd+dig[++e1]; digd_e1_sub_digde2=digd_e1-digde2; } if ( (de0+=step0) >=power10) { de0-=power10; de1++; } if ( (de1+=step1) >=power10) { de1-=power10; digde2=dig[++de2]; digd_e1_sub_digde2=digd_e1-digde2; } if (dig[de0]+dig[de1]-dig[e0] == digd_e1_sub_digde2) { if (dby10 && (e%10==0)) continue; /* Not true vampire */ if (dig64[d]+dig64[e1]+dig64[e0] == dig64[de0]+dig64[de1]+dig64[de2]) { printf("%Lu = %lu*%lu\n", (int64) d*e,d,e); vampcount++; } else { fprintf(stderr,"dig64<>dig for: "); fprintf(stderr,"%Lu = %lu*%lu\n", (int64) d*e,d,e); } } } } fprintf(stderr,"%d vampire numbers found.\n",vampcount); } int main (void) { initdigit(); fprintf(stderr,"Searching..\n"); searchvampadd12(); fprintf(stderr,"Exiting after searchvampadd12.\n"); return 0; }