소스 파일명: testWhile.ml

  1. (*
  2.  *  Filename: testWhile.ml
  3.  *
  4.  *  Purpose:  Example using the while loop syntax
  5.  *                while ....
  6.  * 
  7.  *  Execute: ocaml testWhile.ml -200 300
  8.  * 
  9.  *    Or
  10.  * 
  11.  *  Compile: ocamlc -o testWhile.exe testWhile.ml
  12.  *  Execute: testWhile -200 300
  13.  *)
  14. (* 사용법 표시 *)
  15. let printUsage() =
  16.     Printf.printf "Using: testWhile.py [integer1] [integer2]\n"; 
  17.     Printf.printf "This finds the greatest common divisor of the given two integers.\n";;
  18. let cmdArgs = Sys.argv;;
  19. if not ((Array.length cmdArgs) = 3) then
  20.     printUsage();;
  21. if not ((Array.length cmdArgs) == 3) then
  22.     exit 1;;
  23. (*
  24. // --------------------------------------
  25. // 명령행 인자의 두 스트링을 가져와서
  26. // 정수 타입으로 변환하여
  27. // 변수 val1과 val2에 저장한다.
  28. *)
  29. let val1 = int_of_string cmdArgs.(1);;
  30. let val2 = int_of_string cmdArgs.(2);;
  31. (* a는 |val1|, |val2| 중 큰 값 *)
  32. let a = ref (abs val1);;
  33. let b = ref (abs val2);;
  34. if (!a < !b) then
  35.     let t = !a in
  36.     a := abs val2;
  37.     b := t;;
  38. if (!b = 0) then
  39.     Printf.printf "GCD(%d, %d) = %d\n" val1 val2 !a;;
  40. if (!b = 0) then
  41.     exit 0;;
  42. (*
  43. // --------------------------------------
  44. // Euclidean 알고리즘의 시작
  45. //
  46. // a를 b로 나누어 몫은 q에, 나머지는 r에 저장
  47. *)
  48. let q = ref (!a / !b);;
  49. let r = ref (!a mod !b);;
  50. (*
  51. // --------------------------------------
  52. // Euclidean 알고리즘의 반복 (나머지 r이 0이 될 때 까지)
  53. *)
  54. while not (!r = 0) do
  55.     a := !b;
  56.     b := !r;
  57.     q := !a / !b;
  58.     r := !a mod !b;
  59. done;;
  60. (* 나머지가 0이면 그 때 나눈 수(제수) b가 최대공약수(GCD)이다. *)
  61. let gcd = !b;;
  62. (* 최대공약수(GCD)를 출력한다. *)
  63. Printf.printf "GCD(%d, %d) = %d\n" val1 val2 gcd;;



컴파일:

Command> ocamlc -o testWhile.exe testWhile.ml

실행:

Command> testWhile
Using: TestWhile [integer1] [integer2]
This finds the greatest common divisor of the given two integers.

Command> testWhile -200 300
GCD(-200, 300) = 100

Command> testWhile -200 0
GCD(-200, 0) = 200

Command> testWhile 125 100
GCD(125, 100) = 25

Command> testWhile 23 25
GCD(23, 25) = 1



Posted by Scripter
,