home *** CD-ROM | disk | FTP | other *** search
/ DP Tool Club 15 / CD_ASCQ_15_070894.iso / vrac / tpchal_1.zip / LH.C < prev    next >
C/C++ Source or Header  |  1994-05-26  |  2KB  |  90 lines

  1. /*
  2. **  Larry Hudson (1:206/2503)
  3. */
  4.  
  5. #include <stdio.h>
  6. #include <string.h>
  7. #include <setjmp.h>
  8.  
  9. typedef enum { FALSE, TRUE } bool; /*  Boolean values       */
  10.  
  11. int  get_next(int dig);
  12. void eval(int idx);
  13.  
  14. bool avail[10]; /*  Array to keep track of available digits */
  15. long number;    /*  The number in process                   */
  16. jmp_buf env;
  17.  
  18. int  main()
  19. {
  20. #ifdef TEST
  21.     int I;
  22.  
  23.     for (I = 0; I < 1000; ++I)
  24.     {
  25. #endif
  26.  
  27.         /*  Set avail[] array for all digits available          */
  28.  
  29.         memset(avail, TRUE, sizeof(avail));
  30.         number = 0L;
  31.         if (0 == setjmp(env))
  32.             eval(1);                /*  Find the number(s)      */
  33. #ifdef TEST
  34.     }
  35. #endif
  36.     printf("%ld\n", number);    /* Print result */
  37.     return 0;
  38. }
  39.  
  40. /*
  41. ** Find next available digit
  42. */
  43.  
  44. int  get_next(int dig)
  45. {
  46.     for (avail[dig++] = TRUE; dig < 10; ++dig)
  47.     {
  48.         if (avail[dig])
  49.         {
  50.             avail[dig] = FALSE;
  51.             break;
  52.         }
  53.     }
  54.     return dig;
  55. }
  56.  
  57. /*
  58. ** Recursively evaluate the number
  59. */
  60.  
  61. void eval(int idx)
  62. {
  63.     int  digit;                 /*  Current digit this level*/
  64.  
  65.     digit = get_next(0);        /*  Get lowest avail digit  */
  66.     number = number * 10 + digit;   /*  Add to end of number*/
  67.  
  68.     while (1)
  69.     {
  70.         if (number % idx == 0)  /*  Evenly divisible?       */
  71.         {
  72.             if (idx == 9)       /*  All nine digits?        */
  73.                 longjmp(env, -1);
  74.             else
  75.                 eval(idx + 1);  /*  Next digit level        */
  76.         }
  77.  
  78.         number -= digit;        /*  Remove current digit    */
  79.  
  80.         /*  Get next higher digit                           */
  81.         if ((digit = get_next(digit)) > 9)
  82.         {
  83.             /*  Out of digits, truncate number and return   */
  84.             number /= 10;
  85.             return;
  86.         }
  87.         number += digit;        /*  Add new current digit   */
  88.     }
  89. }
  90.