다음은 초등학교에서 배우는 나눗셈 계산표를 만들어주는 Ruby 소스 코드이다.
나눗셈 계산표를 완성하고 나서 약수, 배수 관계를 알려준다.
- # Filename: makeDivisionTable.rb
- #
- # Purpose: Make a division table in a handy written form.
- #
- # Execute: ruby makeDivisionTable.rb 12345 32
- # ruby makeDivisionTable.rb 500210 61
- #
- # Date: 2008/05/15
- # Author: PH Kim [ pkim ((AT)) scripts.pe.kr ]
- def println(s)
- print "%s\n" % s
- end
- def printUsage()
- # println("Using: ruby makeDivisionTable.rb [numerator] [denominator]")
- # println("Make a division table in a handy written form.")
- println("사용법: ruby makeDivisionTable.rb [피제수] [제수]")
- println("손으로 작성한 형태의 나눗셈 표를 만들어준다.")
- end
- def simplify(v, width)
- t = "%d" % v
- if t[t.length - 2...t.length] == ".0"
- t = t[0...t.length - 2]
- end
- slen = t.length
- if slen < width
- t = " " * (width - slen) + t
- end
- return t
- end
- def getSuffix(v)
- t = v % 10
- suffix = "은"
- if "2459".index("%d" % v)
- suffix = "는"
- end
- return suffix
- end
- def makeTable(numer, denom, quotient)
- strNumer = "%d" % numer
- strDenom = "%d" % denom
- strQuotient = "%d" % quotient
- lenN = strNumer.length
- lenD = strDenom.length
- lenQ = strQuotient.length
- offsetLeft = 3 + lenD + 3
- spaces = " "
- uline = "_" * (lenN + 2)
- sline = "-" * lenN
- bias = lenN - lenQ
- println(spaces[0...offsetLeft] + spaces[0...bias] + "%d" % quotient)
- println(spaces[0...offsetLeft - 2] + uline)
- print(" " + strDenom + " ) " + strNumer)
- strTmpR = strNumer[0 ... bias + 1]
- tmpR = strTmpR.to_i
- tmpSub = 0
- oneDigit = nil
- for i in 0...lenQ
- if strQuotient[i ... i + 1] == "0"
- if i + 1 < lenQ
- oneDigit = strNumer[bias + i + 1 ... bias + i + 2]
- print(oneDigit)
- strTmpR = strTmpR + oneDigit
- tmpR = strTmpR.to_i
- end
- else
- println("")
- tmpSub = strQuotient[i ... i + 1].to_i * denom
- println(spaces[0 ... offsetLeft] + simplify(tmpSub, bias + i + 1))
- println(spaces[0 ... offsetLeft] + sline)
- tmpR = tmpR - tmpSub
- if tmpR == 0 and i + 1 < lenQ
- print(spaces[0 ... offsetLeft] + spaces[0 ... bias + i + 1])
- else
- print(spaces[0 ... offsetLeft] + simplify(tmpR, bias + i + 1))
- end
- strTmpR = "%d" % tmpR
- if i + 1 < lenQ
- oneDigit = strNumer[bias + i + 1 ... bias + i + 2]
- print(oneDigit)
- strTmpR = strTmpR + oneDigit
- tmpR = strTmpR.to_i
- end
- end
- end
- println("")
- return tmpR
- end
- if ARGV.length < 2
- printUsage()
- exit(1)
- end
- a = nil
- b = nil
- begin
- a = ARGV[0].to_i
- b = ARGV[1].to_i
- rescue
- println("숫자 입력에 오류가 있습니다.")
- exit(1)
- end
- if a <= 0
- println("피제수: %d" % a)
- println("피제수는 양의 정수라야 합니다.")
- exit(1)
- elsif b <= 0
- println("제수: %d" % b)
- println("제수는 양의 정수라야 합니다.");
- exit(1)
- end
- q = a / b
- r = a % b
- print("나눗셈 %d ÷ %d 의 결과: " % [a, b])
- print("몫: %d, " % q)
- println("나머지: %d" % r)
- println("")
- k = makeTable(a, b, q)
- if k == r
- println("\n나머지: %d" % k)
- end
- if k == 0
- println("%d = %d x %d" % [a, b, q])
- println("%d%s %d의 배수(mupltiple)이다." % [a, getSuffix(a), b])
- println("%d%s %d의 약수(divisor)이다." % [b, getSuffix(b), a])
- else
- println("%d = %d x %d + %d" % [a, b, q, r])
- println("%d%s %d의 배수(mupltiple)가 아니다." % [a, getSuffix(a), b])
- 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)가 아니다.
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
'프로그래밍 > Ruby' 카테고리의 다른 글
손으로 계산하는 긴자리 곱셈표 만들기 with Ruby (0) | 2009.03.06 |
---|---|
문자열 거꾸로 하기 with Ruby (0) | 2009.01.25 |
클래스 상속(subclassing) 예제 with Ruby (0) | 2008.04.05 |
삼각형 출력 예제를 통한 여러 가지 소스 비교 with Ruby (0) | 2008.04.05 |
7비트 ASCII 코드표 만들기 예제 with Ruby (0) | 2008.03.31 |