Advertisement
fivemack

Pandigital arbitrary-base slow

Jun 13th, 2018
132
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.51 KB | None | 0 0
  1. #include <stdio.h>
  2.  
  3. int main(void)
  4. {
  5. unsigned char q[21], r[21], t[21];
  6. for (int base=4; base<20; base+=2)
  7. {
  8. for (int i=0; i<20; i++) q[i]=0;
  9. q[base]=77;
  10. unsigned long long ct = 0;
  11. while (q[base]!=78)
  12. {
  13. for (int i=0; i<base; i++) r[i]=i;
  14. // convert from mixed-base to factorial
  15. for (int i=0; i<base; i++)
  16. {
  17. t[i]=r[q[i]];
  18. for (int j=q[i]+1; j<base; j++) r[j-1]=r[j];
  19. }
  20. // prepare the numbers
  21. unsigned long long Z1=0,Z2=0,Z3=0;
  22. for (int i=0; i<base/2; i++)
  23. {
  24. Z1=(Z1*base)+t[i];
  25. Z2=(Z2*base)+t[i+base/2];
  26. }
  27. if (Z1<Z2)
  28. {
  29. // multiply
  30. Z3 = Z1*Z2; unsigned long long Z3u=Z3;
  31. unsigned long long msk = 0;
  32. for (int i=0; i<base; i++)
  33. {
  34. msk |= 1<<(Z3%base);
  35. Z3/=base;
  36. }
  37. if (msk == (1<<base)-1)
  38. {
  39. ct++;
  40. // printf("%d %llu %llu %llu\n", base, Z1, Z2, Z3u);
  41. }
  42. }
  43.  
  44. // (base 4) 30*21=1230
  45.  
  46. // and increment
  47. q[0]++;
  48. int j = 0;
  49. while (q[j]==(base-j) && j<base) { q[j]=0; q[1+j]++; j++; }
  50. }
  51. printf("%d %d\n", base, ct);
  52. }
  53. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement