PROG5.MOD 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. MODULE prog5;
  2. (* this program lists the 9-digit numbers, containing every
  3. digit from 1 to 9 which are a product of three 3-digit
  4. numbers, which also contain every digit from 1 to 9 *)
  5. IMPORT IO;
  6. FROM perms IMPORT NextPerm;
  7. PROCEDURE check(n:LONGCARD):BOOLEAN;
  8. (* Checks if the digits of n are a permutation of 1..9 *)
  9. VAR i:[1..9];
  10. digit:[0..9];
  11. seen:ARRAY [0..9] OF BOOLEAN;
  12. BEGIN
  13. seen[0] := TRUE;
  14. FOR i := 1 TO 9 DO
  15. seen[i] := FALSE;
  16. END;
  17. FOR i := 1 TO 9 DO
  18. digit := CARDINAL(n MOD 10); (* n MOD 10 is the remainder
  19. when n is divided by 10 *)
  20. IF seen[ digit ] THEN
  21. RETURN FALSE;
  22. ELSE
  23. seen[ digit ] := TRUE;
  24. END;
  25. n := n DIV 10; (* DIV means whole number division *)
  26. END;
  27. RETURN TRUE;
  28. END check;
  29. VAR d:ARRAY[0..8] OF SHORTCARD;
  30. a,b,c:CARDINAL;
  31. n:LONGCARD;
  32. i:CARDINAL;
  33. wrap:BOOLEAN;
  34. BEGIN
  35. FOR i := 0 TO 8 DO
  36. d[i] := SHORTCARD(i) + 1;
  37. END;
  38. REPEAT
  39. a := CARDINAL(d[0])*100 + CARDINAL( d[1]*10 + d[2] );
  40. b := CARDINAL(d[3])*100 + CARDINAL( d[4]*10 + d[5] );
  41. c := CARDINAL(d[6])*100 + CARDINAL( d[7]*10 + d[8] );
  42. n := LONGCARD(a) * LONGCARD(b) * LONGCARD(c);
  43. IF check(n) THEN
  44. IO.WrStr('A solution is ');
  45. IO.WrCard(a, 1);
  46. IO.WrStr(' x ');
  47. IO.WrCard(b, 1);
  48. IO.WrStr(' x ');
  49. IO.WrCard(c, 1);
  50. IO.WrStr(' = ');
  51. IO.WrLngCard(n, 1);
  52. IO.WrLn;
  53. END;
  54. NextPerm(9,d,wrap);
  55. UNTIL wrap;
  56. END prog5.
  57.