home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 18 REXX / 18-REXX.zip / rexxalgo.zip / TESTALGO / Euclid.cmd < prev    next >
OS/2 REXX Batch file  |  1997-08-25  |  4KB  |  97 lines

  1. /* REXX **********************************************/
  2. /*                                                   */
  3. /* Name.......: Euclid.CMD                           */
  4. /* Function...: Get greatest common divisor of 2 dig.*/
  5. /*                                                   */
  6. /* Author.....: Janosch R. Kowalczyk                 */
  7. /*              Compuserve: 101572,2160              */
  8. /*              Internet: 101572.2160@compuserve.com */
  9. /* Create date: Fri, 06 Jun 1997 / 157 / 22:46:06    */
  10. /* Version....: 1.0                                  */
  11. /*                                                   */
  12. /* Changes....: No                                   */
  13. /*                                                   */
  14. /* Notes......: Start this file with PMREXX to see   */
  15. /*              the output lines.                    */
  16. /*                                                   */
  17. /* Made use of GREED.  26 May 1996 / 12:29:24   JRK  */
  18. /*****************************************************/
  19. /* trace ?R */
  20. Arg _counter, _denuminator
  21.  
  22. /*===============(Exception handling)================*/
  23. Signal On Failure Name CLEARUP
  24. Signal On Halt    Name CLEARUP
  25. Signal On Syntax  Name CLEARUP
  26.  
  27. If RxFuncQuery('SysLoadFuncs') Then Do
  28.   Call RxFuncAdd 'SysLoadFuncs', 'RexxUtil', 'SysLoadFuncs'
  29.   Call SysLoadFuncs
  30. End /* If RxFuncQuery... */
  31.  
  32. Say 
  33. Say Center( "( GET GREATEST COMMON DIVISOR )", 80, '*')
  34. Say
  35. /*----------(Test greatest common divisor)------------*/
  36. If DataType( _counter ) \= 'NUM' Then _counter = 400
  37. If DataType( _denuminator ) \= 'NUM' Then _denuminator = 600
  38.  
  39. gcd = EuclidGCD( _counter, _denuminator )
  40. Say Left(_counter '/' _denuminator, 9) '=',
  41.     Left(_counter/gcd '/' _denuminator/gcd, 12), 
  42.     'Greatest common divisor:' gcd
  43.  
  44. Do 15
  45.   _counter = Random()
  46.   _denuminator = Random() 
  47.   gcd = EuclidGCD( _counter, _denuminator )
  48.   Say Left(_counter '/' _denuminator, 9) '=',
  49.       Left(_counter/gcd '/' _denuminator/gcd, 12), 
  50.       'Greatest common divisor:' gcd
  51. End
  52.  
  53. Say
  54. Call LineOut , "Press any key to exit "
  55. Call LineIn
  56.  
  57. Exit
  58.  
  59. CLEARUP:
  60.   Say
  61.   Say 'GREED001E - Break, Failure or Syntax Error'
  62. Exit
  63.  
  64.  
  65. /*===============(Internal subroutines)===============*/
  66. /*=============( Greatest common divisor )============*/
  67. /*                                                 18 */
  68. /* Name.......: EuclidGCD                             */
  69. /*                                                    */
  70. /* Function...: Get greatest common divisor (Euclids  */
  71. /*              algorithm)                            */
  72. /* Call parm..: _counter                              */
  73. /*              _denuminator                          */
  74. /* Returns....: gcd                                   */
  75. /*                                                    */
  76. /* Syntax.....:                                       */
  77. /*    gcd = EuclidGCD( _counter, _denuminator )       */
  78. /*                                                    */
  79. /* Changes....: No                                    */
  80. /*                                                    */
  81. /* Author.....: Janosch R. Kowalczyk                  */
  82. /*====================================================*/
  83. EuclidGCD: Procedure
  84. Arg _counter, _denuminator
  85.  
  86. Do Until _counter = 0
  87.   If _counter < _denuminator Then Do
  88.     _Xchange     = _counter
  89.     _counter     = _denuminator
  90.     _denuminator = _Xchange
  91.   End
  92.   _counter = _counter - _denuminator
  93. End
  94.  
  95. Return _denuminator
  96.  
  97.