다음은 초등학교에서 배우는 나눗셈 계산표를 만들어주는 Groovy 소스 코드이다.
나눗셈 계산표를 완성하고 나서 약수, 배수 관계를 알려준다.
- /*
- * Filename: makeDivisionTable.groovy
- *
- * Purpose: Make a division table in a handy written form.
- *
- * Execute: groovy makeDivisionTable.groovy 12345 32
- * groovy makeDivisionTable.groovy 500210 61
- *
- * Date: 2008/05/15
- * Author: PH Kim [ pkim ((AT)) scripts.pe.kr ]
- */
- def printUsage() {
- println("사용법: groovy makeDivisionTable.groovy [피제수] [제수]")
- println("손으로 작성한 형태의 나눗셈 표를 만들어준다.")
- }
- def simplify(BigInteger v, int width) {
- String t = "" + v
- if (t.endsWith(".0"))
- t = t.substring(0, t.length() - 2)
- int len = t.length()
- if (len < width)
- t = " ".substring(0, width - len) + t;
- return t
- }
- def getSuffix(BigInteger v) {
- BigInteger t = v % 10G
- String suffix = "은"
- if ("2459".indexOf("" + t) >= 0) {
- suffix = "는"
- }
- return suffix
- }
- BigInteger makeTable(BigInteger numer, BigInteger denom, BigInteger quotient) {
- String strNumer = "" + numer
- String strDenom = "" + denom
- String strQuotient = "" + quotient
- int lenN = strNumer.length()
- int lenD = strDenom.length()
- int lenQ = strQuotient .length()
- int offsetLeft = 3 + lenD + 3
- String spaces = " ";
- String uline = "_" * (lenN + 2)
- String sline = "-" * lenN
- int bias = lenN - lenQ
- println(spaces.substring(0, offsetLeft) + spaces.substring(0, bias) + quotient)
- println(spaces.substring(0, offsetLeft - 2) + uline)
- System.out.print(" " + strDenom + " ) " + strNumer)
- String strTmpR = strNumer.substring(0, bias + 1)
- BigInteger tmpR = new BigInteger(strTmpR)
- BigInteger tmpSub = 0G
- String oneDigit = null
- for (int i = 0; i < lenQ; i++) {
- if (strQuotient.substring(i, i + 1).equals("0")) {
- if (i + 1 < lenQ) {
- oneDigit = strNumer.substring(bias + i + 1, bias + i + 2)
- print(oneDigit)
- strTmpR += oneDigit
- tmpR = new BigInteger(strTmpR)
- }
- }
- else {
- println()
- tmpSub = new BigInteger(strQuotient.substring(i, i + 1)).multiply(denom)
- println(spaces.substring(0, offsetLeft) + simplify(tmpSub, bias + i + 1))
- println(spaces.substring(0, offsetLeft) + sline)
- tmpR = tmpR.subtract(tmpSub)
- if (tmpR == 0G && i + 1 < lenQ) {
- print(spaces.substring(0, offsetLeft) + spaces.substring(0, bias + i + 1))
- }
- else {
- print(spaces.substring(0, offsetLeft) + simplify(tmpR, bias + i + 1))
- }
- strTmpR = "" + tmpR;
- if (i + 1 < lenQ) {
- oneDigit = strNumer.substring(bias + i + 1, bias + i + 2)
- print(oneDigit)
- strTmpR += oneDigit
- tmpR = new BigInteger(strTmpR)
- }
- }
- }
- println()
- return tmpR
- }
- if (args.length < 2) {
- printUsage()
- System.exit(1)
- }
- BigInteger a = null
- BigInteger b = null
- try {
- a = new BigInteger(args[0])
- b = new BigInteger(args[1])
- }
- catch (NumberFormatException ex) {
- println("피제수: " + args[0] + ", 제수: " + args[1])
- println("숫자 입력에 오류가 있습니다.")
- System.exit(1)
- }
- if (a.compareTo(BigInteger.ZERO) <= 0) {
- println("피제수: " + a)
- println("피제수는 양의 정수라야 합니다.")
- System.exit(1)
- }
- else if (b.compareTo(BigInteger.ZERO) <=0) {
- println("제수: " + b)
- println("제수는 양의 정수라야 합니다.");
- System.exit(1)
- }
- BigInteger q = a.divide(b)
- BigInteger r = a.mod(b)
- print("나눗셈 " + a + " ÷ " + b + " 의 결과: ")
- print("몫: " + q + ", ")
- println("나머지: " + r)
- println()
- BigInteger k = makeTable(a, b, q)
- if (k == r) {
- println("\n나머지: " + k)
- }
- if (k == 0G) {
- println(a + " = " + b + " x " + q)
- println(a + getSuffix(a) + " " + b + "의 배수(mupltiple)이다.")
- println(b + getSuffix(b) + " " + a + "의 약수(divisor)이다.")
- }
- else {
- println(a + " = " + b + " x " + q + " + " + r)
- println(a + getSuffix(a) + " " + b + "의 배수(mupltiple)가 아니다.")
- }
실행> 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)가 아니다.
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
'프로그래밍 > Groovy' 카테고리의 다른 글
손으로 계산하는 긴자리 곱셈표 만들기 with Groovy (0) | 2009.03.06 |
---|---|
문자열 거꾸로 하기 with Groovy (0) | 2009.01.25 |
클래스 상속(subclassing) 예제 with Groovy (0) | 2008.04.05 |
JDK 1.6 의 java.awt.Desktop 사용 예 with Java and Groovy (0) | 2008.04.04 |
삼각형 출력 예제를 통한 여러 가지 소스 비교 with Groovy (0) | 2008.04.02 |