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

아래의 소스는 Jython에서는 수정없이 그대로 실행되지만,
IronPython에서는 인코딩 선언 부분을

        # -*- encoding: ms949 -*-

대신

        # -*- encoding: cp949 -*-
        # -*- encoding: CP949 -*-
        # -*- encoding: euc-kr -*-
        # -*- encoding: EUC-KR -*-

중 하나로 수정해야 실행된다.

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




실행> python makeDivisionTable.py 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
,