다음은 초등학교에서 배우는 나눗셈 계산표를 만들어주는 Groovy 소스 코드이다.
나눗셈 계산표를 완성하고 나서 약수, 배수 관계를 알려준다.


  1. /*
  2.  *  Filename: makeDivisionTable.groovy
  3.  *
  4.  *  Purpose:  Make a division table in a handy written form.
  5.  *
  6.  *  Execute: groovy makeDivisionTable.groovy 12345 32
  7.  *           groovy makeDivisionTable.groovy 500210 61
  8.  *
  9.  *     Date:  2008/05/15
  10.  *   Author:  PH Kim   [ pkim ((AT)) scripts.pe.kr ]
  11.  */
  12. def printUsage() {
  13.     println("사용법: groovy makeDivisionTable.groovy [피제수] [제수]")
  14.     println("손으로 작성한 형태의 나눗셈 표를 만들어준다.")
  15. }
  16. def simplify(BigInteger v, int width) {
  17.     String t = "" + v
  18.     if (t.endsWith(".0"))
  19.         t = t.substring(0, t.length() - 2)
  20.         int len = t.length()
  21.         if (len < width)
  22.             t = "                                                                                             ".substring(0, width - len) + t;
  23.     return t
  24. }
  25. def getSuffix(BigInteger v) {
  26.     BigInteger t = v % 10G
  27.     String suffix = "은"
  28.     if ("2459".indexOf("" + t) >= 0) {
  29.         suffix = "는"
  30.     }
  31.     return suffix
  32. }
  33. BigInteger makeTable(BigInteger numer, BigInteger denom, BigInteger quotient) {
  34.     String strNumer = "" + numer
  35.     String strDenom = "" + denom
  36.     String strQuotient = "" + quotient
  37.     int lenN = strNumer.length()
  38.     int lenD = strDenom.length()
  39.     int lenQ = strQuotient .length()
  40.     int offsetLeft = 3 + lenD + 3
  41.     String spaces = "                                                                                 ";
  42.     String uline  = "_" * (lenN + 2)
  43.     String sline  = "-" * lenN
  44.     int bias = lenN - lenQ
  45.     println(spaces.substring(0, offsetLeft) + spaces.substring(0, bias) + quotient)
  46.     println(spaces.substring(0, offsetLeft - 2) + uline)
  47.     System.out.print("   " + strDenom + " ) " + strNumer)
  48.     String strTmpR = strNumer.substring(0, bias + 1)
  49.     BigInteger tmpR = new BigInteger(strTmpR)
  50.     BigInteger tmpSub = 0G
  51.     String oneDigit = null
  52.     for (int i = 0; i < lenQ; i++) {
  53.         if (strQuotient.substring(i, i + 1).equals("0")) {
  54.             if (i + 1 < lenQ) {
  55.                 oneDigit = strNumer.substring(bias + i + 1, bias + i + 2)
  56.                 print(oneDigit)
  57.                 strTmpR += oneDigit
  58.                 tmpR = new BigInteger(strTmpR)
  59.             }
  60.         }
  61.             else {
  62.             println()
  63.             tmpSub = new BigInteger(strQuotient.substring(i, i + 1)).multiply(denom)
  64.             println(spaces.substring(0, offsetLeft) + simplify(tmpSub, bias + i + 1))
  65.             println(spaces.substring(0, offsetLeft) + sline)
  66.             tmpR = tmpR.subtract(tmpSub)
  67.             if (tmpR == 0G && i + 1 < lenQ) {
  68.                 print(spaces.substring(0, offsetLeft) + spaces.substring(0, bias + i + 1))
  69.             }
  70.             else {
  71.                 print(spaces.substring(0, offsetLeft) + simplify(tmpR, bias + i + 1))
  72.             }
  73.             strTmpR = "" + tmpR;
  74.             if (i + 1 < lenQ) {
  75.                 oneDigit = strNumer.substring(bias + i + 1, bias + i + 2)
  76.                 print(oneDigit)
  77.                 strTmpR += oneDigit
  78.                 tmpR = new BigInteger(strTmpR)
  79.             }
  80.         }
  81.     }
  82.     println()
  83.     return tmpR
  84. }
  85. if (args.length < 2) {
  86.     printUsage()
  87.     System.exit(1)
  88. }
  89. BigInteger a = null
  90. BigInteger b = null
  91. try {
  92.     a = new BigInteger(args[0])
  93.     b = new BigInteger(args[1])
  94. }
  95. catch (NumberFormatException ex) {
  96.     println("피제수: " + args[0] + ", 제수: " + args[1])
  97.     println("숫자 입력에 오류가 있습니다.")
  98.     System.exit(1)
  99. }
  100. if (a.compareTo(BigInteger.ZERO) <= 0) {
  101.     println("피제수: " + a)
  102.     println("피제수는 양의 정수라야 합니다.")
  103.     System.exit(1)
  104. }
  105. else if (b.compareTo(BigInteger.ZERO) <=0) {
  106.     println("제수: " + b)
  107.     println("제수는 양의 정수라야 합니다.");
  108.     System.exit(1)
  109. }
  110. BigInteger q = a.divide(b)
  111. BigInteger r = a.mod(b)
  112. print("나눗셈 " + a + " ÷ " + b + " 의 결과: ")
  113. print("몫: " + q + ", ")
  114. println("나머지: " + r)
  115. println()
  116. BigInteger k = makeTable(a, b, q)
  117. if (k == r) {
  118.     println("\n나머지: " + k)
  119. }
  120. if (k == 0G) {
  121.     println(a + " = " + b + " x " + q)
  122.     println(a + getSuffix(a) + " " + b + "의 배수(mupltiple)이다.")
  123.     println(b + getSuffix(b) + " " + a + "의 약수(divisor)이다.")
  124. }
  125. else {
  126.     println(a + " = " + b + " x " + q + " + " + r)
  127.     println(a + getSuffix(a) + " " + b + "의 배수(mupltiple)가 아니다.")
  128. }




실행> groovy makeDivisionTable.groovy 500210 61

나눗셈 500210 ÷ 61 의 결과: 몫: 8200, 나머지: 10

          8200
      ________
   61 ) 500210
        488
        ------
         122
         122
        ------
            10

나머지: 10
500210 = 61 x 8200 + 10
500210은 61의 배수(mupltiple)가 아니다.




Creative Commons License

이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.

Posted by Scripter
,