home *** CD-ROM | disk | FTP | other *** search
/ Media Share 9 / MEDIASHARE_09.ISO / progmisc / nfsrc21.zip / GCD.PRG < prev    next >
Text File  |  1991-08-16  |  3KB  |  95 lines

  1. /*
  2.  * File......: GCD.PRG
  3.  * Author....: David Husnian
  4.  * Date......: $Date:   15 Aug 1991 23:03:40  $
  5.  * Revision..: $Revision:   1.2  $
  6.  * Log file..: $Logfile:   E:/nanfor/src/gcd.prv  $
  7.  * 
  8.  * This is an original work by David Husnian and is placed in the
  9.  * public domain.
  10.  *
  11.  * Modification history:
  12.  * ---------------------
  13.  *
  14.  * $Log:   E:/nanfor/src/gcd.prv  $
  15.  * 
  16.  *    Rev 1.2   15 Aug 1991 23:03:40   GLENN
  17.  * Forest Belt proofread/edited/cleaned up doc
  18.  * 
  19.  *    Rev 1.1   14 Jun 1991 19:51:56   GLENN
  20.  * Minor edit to file header
  21.  * 
  22.  *    Rev 1.0   01 Apr 1991 01:01:26   GLENN
  23.  * Nanforum Toolkit
  24.  *
  25.  */
  26.  
  27.  
  28. /*  $DOC$
  29.  *  $FUNCNAME$
  30.  *     FT_GCD()
  31.  *  $CATEGORY$
  32.  *     Math
  33.  *  $ONELINER$
  34.  *     Calculate greatest common divisor of two numbers
  35.  *  $SYNTAX$
  36.  *     FT_GCD( <nNumber1>, <nNumber2> ) -> nGCD
  37.  *  $ARGUMENTS$
  38.  *     <nNumber1> is the first number to find the GCD of.
  39.  *
  40.  *     <nNumber2> is the second number to find the GCD of.
  41.  *  $RETURNS$
  42.  *     The greatest common divisor of the 2 numbers, or 0 if either is 0.
  43.  *  $DESCRIPTION$
  44.  *   This function calculates the greatest common divisor between 2 numbers,
  45.  *   i.e., the largest number that will divide into both numbers evenly.  It
  46.  *   will return zero (0) if either number is zero.
  47.  *  $EXAMPLES$
  48.  *     ? FT_GCD(10,15)                  // Result: 5
  49.  *     ? FT_GCD(108,54)                 // Result: 54
  50.  *     ? FT_GCD(102,54)                 // Result: 6
  51.  *     ? FT_GCD(111,17)                 // Result: 1
  52.  *  $END$
  53.  */
  54.  
  55.  
  56. #command    REPEAT ;
  57.             => ;
  58.             DO WHILE .T.
  59.  
  60. #command    UNTIL <Condition> ;
  61.             => ;
  62.             IF <Condition> ; EXIT ; END ; END
  63.  
  64. #ifdef FT_TEST
  65.   FUNCTION MAIN( cNum1, cNum2 )
  66.      RETURN OUTSTD( STR(FT_GCD( val(cNum1), val(cNum2) )) + CHR(13) + CHR(10) )
  67. #endif
  68.  
  69. FUNCTION FT_GCD(nNumber1, nNumber2)
  70.  
  71.    LOCAL nHold1, ;                      // Temporarily Hold the Maximum Number
  72.          nHold2, ;                      // Temporarily Hold the Minimum Number
  73.          nResult                        // GCD
  74.  
  75.                                         // Either Number Zero??
  76.    IF (nNumber1 == 0 .OR. nNumber2 == 0)
  77.       nResult := 0                      // Yes, Can't Have a GCD
  78.    ELSE                                 // No, Calculate the GCD
  79.  
  80.       nHold1 := MAX(ABS(nNumber1), ABS(nNumber2))
  81.       nHold2 := MIN(ABS(nNumber1), ABS(nNumber2))
  82.  
  83.       REPEAT
  84.  
  85.          nResult := nHold1 % nHold2     // Get the Remainder
  86.          nHold1  := nHold2              // Which Makes a New Maximum Number
  87.          nHold2  := nResult             // and it's the Minimum Number
  88.  
  89.       UNTIL nResult <= 0
  90.  
  91.       nResult := nHold1                 // Maximum Number Should Be the Answer
  92.  
  93.    ENDIF                                // nNumber1 == 0 or nNumber2 == 0
  94.    RETURN (nResult)                     // FT_GCD
  95.