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


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




실행> ruby makeDivisionTable.rb 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
,