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


  1. --[[
  2.     Filename: makeDivisionTable.lua
  3.     Purpose:  Make a division table in a handy written form.
  4.     Execute: lua makeDivisionTable.lua 12345 32
  5.              lua makeDivisionTable.lua 500210 61
  6.        Date:  2008/05/15
  7.      Author:  PH Kim   [ pkim ((AT)) scripts.pe.kr ]
  8. --]]
  9. function printUsage()
  10.     -- print("Using: lua makeDivisionTable.lua [numerator] [denominator]")
  11.     -- print("Make a division table in a handy written form.")
  12.     print("사용법: lua makeDivisionTable.lua [피제수] [제수]")
  13.     print("손으로 작성한 형태의 나눗셈 표를 만들어준다.")
  14. end
  15. -- 부동소수점수의 표현이 .0 으로 끝나는 경우 이를 잘라낸다.
  16. -- 전체 문자열 표시 너비는 매개변수 width 로 전달받아 처리한다.
  17. function simplify(v, width)
  18.     t = "" .. v
  19.     tlen = string.len(t)
  20.     if string.sub(t, tlen-2) == ".0" then
  21.         t = string.sub(t, 1, tlen-2)
  22.     end
  23.     if width ~= nil then
  24.         if tlen < width then
  25.             t = string.sub("              ", 1, width - tlen) .. t
  26.         end
  27.     end
  28.     return t
  29. end
  30. function getSuffix(v)
  31.     t = v % 10
  32.     suffix = "은"
  33.     if string.find("2459", "" .. v) then
  34.         suffix = "는"
  35.     end
  36.     return suffix
  37. end
  38. function makeTable(numer, denom, quotient)
  39.     strNumer = tostring(numer)
  40.     strDenom = tostring(denom)
  41.     strQuotient = tostring(quotient)
  42.     lenN = string.len(strNumer)
  43.     lenD = string.len(strDenom)
  44.     lenQ = string.len(strQuotient)
  45.     offsetLeft = 3 + lenD + 3
  46.     spaces = "                                                                                 "
  47.     uline  = string.rep("_", lenN + 2)
  48.     sline  = string.rep("-", lenN)
  49.     bias = lenN - lenQ
  50.     print(string.sub(spaces, 1, offsetLeft) .. string.sub(spaces, 1, bias) .. quotient)
  51.     print(string.sub(spaces, 1, offsetLeft - 2) .. uline)
  52.     io.write("   " .. strDenom .. " ) " .. strNumer)
  53.     strTmpR = string.sub(strNumer, 1, bias + 1)
  54.     tmpR = tonumber(strTmpR)
  55.     tmpSub = 0
  56.     oneDigit = nil
  57.     for i = 1, lenQ do
  58.         if string.sub(strQuotient, i, i) == "0" then
  59.             if i < lenQ then
  60.                 oneDigit = string.sub(strNumer, bias + i + 1, bias + i + 1)
  61.                 io.write(oneDigit)
  62.                 strTmpR = strTmpR .. oneDigit
  63.                 tmpR = tonumber(strTmpR)
  64.             end
  65.         else
  66.             print("")
  67.             tmpSub = tonumber(string.sub(strQuotient, i, i)) * denom
  68.             print(string.sub(spaces, 1, offsetLeft) .. simplify(tmpSub, bias + i))
  69.             print(string.sub(spaces, 1, offsetLeft) .. sline)
  70.             tmpR = tmpR - tmpSub
  71.             if tmpR == 0 and i < lenQ then
  72.                 io.write(string.sub(spaces, 1, offsetLeft - 1) .. string.sub(spaces, 1, bias + i + 1))
  73.             else
  74.                 io.write(string.sub(spaces, 1, offsetLeft - 1) .. simplify(tmpR, bias + i + 1))
  75.             end
  76.             strTmpR = tostring(tmpR)
  77.             if i < lenQ then
  78.                 oneDigit = string.sub(strNumer, bias + i + 1, bias + i + 1)
  79.                 io.write(oneDigit)
  80.                 strTmpR = strTmpR .. oneDigit
  81.                 tmpR = tonumber(strTmpR)
  82.             end
  83.         end
  84.     end
  85.    
  86.     print("")
  87.     return tmpR
  88. end
  89. if #arg < 2 then
  90.     printUsage()
  91.     os.exit(1)
  92. end
  93. a = null
  94. b = null
  95. a = tonumber(arg[1])
  96. b = tonumber(arg[2])
  97. if a <= 0 then
  98.     print("피제수: " .. a)
  99.     print("피제수는 양의 정수라야 합니다.")
  100.     os.exit(1)
  101. elseif b <= 0 then
  102.     print("제수: " .. b)
  103.     print("제수는 양의 정수라야 합니다.");
  104.     os.exit(1)
  105. end
  106. q = math.floor(a / b)
  107. r = a % b
  108. io.write("나눗셈 " .. a .. " ÷ " .. b .. " 의 결과: ")
  109. io.write("몫: " .. q .. ", ")
  110. print("나머지: " .. r)
  111. print("")
  112. k = makeTable(a, b, q)
  113. if k == r  then
  114.     print("\n나머지: " .. k)
  115. end
  116. if k == 0 then
  117.     print(a .. " = " .. b .. " x " .. q)
  118.     print(a .. getSuffix(a) .. " " .. b .. "의 배수(mupltiple)이다.")
  119.     print(b .. getSuffix(b) .. " " .. a .. "의 약수(divisor)이다.")
  120. else
  121.     print(a .. " = " .. b .. " x " .. q .. " + " .. r)
  122.     print(a .. getSuffix(a) .. " " .. b .. "의 배수(mupltiple)가 아니다.")
  123. end




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