다음은 초등학교에서 배우는 나눗셈 계산표를 만들어주는 Go 언어 소스 코드이다.
나눗셈 계산표를 완성하고 나서 약수, 배수 관계를 알려준다.
- /*
- * Filename: makeDivisionTable.go
- *
- * Purpose: Make a division table in a handy written form.
- *
- * Execute: go run makeDivisionTable 12345 32
- * Execute: go run makeDivisionTable 500210 61
- *
- * or
- *
- * Compile: go build makeDivisionTable.go
- * Execute: ./makeDivisionTable 12345 32
- * Execute: ./makeDivisionTable 500210 61
- *
- * Date: 2012/06/27
- * Author: PH Kim [ pkim ((AT)) scripts.pe.kr ]
- */
- package main
- import (
- "fmt"
- "os"
- "strings"
- "bytes"
- "strconv"
- )
- func println(s string) {
- fmt.Printf("%s\n", s)
- }
- func print(s string) {
- fmt.Printf("%s", s)
- }
- func printUsage() {
- println("Using: makeDivisionTable [numerator] [denominator]");
- println("Make a division table in a handy written form.");
- // println("사용법: makeDivisionTable [피제수] [제수]");
- // println("손으로 작성한 형태의 나눗셈 표를 만들어준다.");
- }
- // 부동소수점수의 표현이 .0 으로 끝나는 경우 이를 잘라낸다.
- // 전체 문자열 표시 너비는 매개변수 width 로 전달받아 처리한다.
- func simplify(v float64,width int) string {
- var n, leng int
- var t string = " ";
- var tmp string = " "
- t = fmt.Sprintf("%g", v)
- n = len(t)
- if (n > 2) && (t[n - 2] == '.') && (t[n - 1] == '0') {
- t = t[:n-2]
- }
- leng = len(t)
- tmp = t
- if leng < width {
- t = string(bytes.Repeat([]byte{' '}, width - leng))
- t += tmp
- }
- return t
- }
- // 발음상 숫자에 맞는 주어 조사 "은", "는"을 결정한다.
- func getSuffix(v int64) string {
- var buf string
- var t int64 = v % 10
- var suffix = " "
- var tbuf = " "
- var suf []string = []string { "은", "는"}
- suffix = suf[0]
- tbuf = fmt.Sprintf("%d", t)
- if strings.ContainsAny("2459", tbuf[0:1]) {
- suffix = suf[1]
- }
- buf = suffix
- return buf
- }
- func atoi(s string) int64 {
- var n int
- n, _ = strconv.Atoi(s)
- return int64(n)
- }
- func makeTable(numer int64, denom int64, quotient int64) int64 {
- var sbuf string
- var strNumer string
- var strDenom string
- var strQuotient string
- var strTmpR string;
- var whiteChars string = " ";
- var underbarChars string = "_________________________________________________________________________________";
- var barChars string = "---------------------------------------------------------------------------------";
- var offsetSpaces string
- var biasSpaces string
- var uline string;
- var sline string
- var i int
- var lenN int
- var lenD int
- var lenQ int
- var offsetLeft int
- var bias int
- var tmpR int64
- var tmpSub int64
- var oneDigit byte
- strNumer = fmt.Sprintf("%d", numer)
- strDenom = fmt.Sprintf("%d", denom)
- strQuotient = fmt.Sprintf("%d", quotient)
- lenN = len(strNumer)
- lenD = len(strDenom)
- lenQ = len(strQuotient)
- offsetLeft = 3 + lenD + 3;
- bias = lenN - lenQ
- offsetSpaces = whiteChars[:offsetLeft]
- biasSpaces = whiteChars[:bias]
- uline = underbarChars[: lenN + 2]
- sline = barChars[:lenN]
- fmt.Printf("%s%s%d\n", offsetSpaces, biasSpaces, quotient)
- sbuf = offsetSpaces[:offsetLeft - 2]
- fmt.Printf("%s%s\n", sbuf, uline)
- fmt.Printf(" %s ) %s", strDenom, strNumer)
- strTmpR = strNumer[:bias + 1]
- tmpR = atoi(strTmpR)
- tmpSub = 0
- for i = 0; i < lenQ; i++ {
- if strQuotient[i] == '0' {
- if i + 1 < lenQ {
- oneDigit = strNumer[bias + i + 1]
- fmt.Printf("%c", oneDigit)
- sbuf = fmt.Sprintf("%c", oneDigit)
- strTmpR += sbuf
- tmpR = atoi(strTmpR)
- }
- } else {
- println("")
- tmpSub = int64(strQuotient[i] - '0') * denom
- fmt.Printf("%s%s\n", offsetSpaces, simplify(float64(tmpSub), bias + i + 1))
- fmt.Printf("%s%s\n", offsetSpaces, sline)
- tmpR = tmpR - tmpSub
- if tmpR == 0 && i + 1 < lenQ {
- sbuf = whiteChars[:bias + i + 1]
- fmt.Printf("%s%s", offsetSpaces, sbuf)
- } else {
- fmt.Printf("%s%s", offsetSpaces, simplify(float64(tmpR), bias + i + 1))
- }
- strTmpR = fmt.Sprintf("%d", tmpR)
- if i + 1 < lenQ {
- oneDigit = strNumer[bias + i + 1]
- fmt.Printf("%c", oneDigit)
- sbuf = fmt.Sprintf("%c", oneDigit)
- strTmpR += sbuf
- tmpR = atoi(strTmpR)
- }
- }
- }
- println("")
- return tmpR
- }
- // Go 언어의 실행 시작 지점
- func main() {
- var a, b, q, r, k int64
- var mbuf string
- if len(os.Args) < 3 {
- printUsage()
- // os.Exit(1)
- return
- }
- a = atoi(os.Args[1])
- b = atoi(os.Args[2])
- if a <= 0 {
- /// fmt.Printf("피제수: %d\n", a)
- /// println("피제수는 양의 정수라야 합니다.")
- fmt.Printf("dividend: %d\n", a)
- println("The dividend should be a positive integer.")
- // os.Exit(1)
- return
- }
- if b <= 0 {
- /// fmt.Printf("제수: %d\n", b)
- /// println("제수는 양의 정수라야 합니다.")
- fmt.Printf("divider: %d\n", b)
- println("The divider should be a positive integer.")
- // os.Exit(1)
- return
- }
- q = a / b
- r = a % b
- /// fmt.Printf("나눗셈 %d ÷ %d 의 결과: ", a, b)
- /// fmt.Printf("몫: %d, ", q)
- /// fmt.Printf("나머지: %d\n", r)
- fmt.Printf("The result of division %d / %d: ", a, b)
- fmt.Printf("quotient: %d, ", q)
- fmt.Printf("remainder: %d\n", r)
- println("")
- k = makeTable(a, b, q)
- if k == r {
- /// fmt.Printf("\n나머지: %d\n", k)
- fmt.Printf("\nRemainder is %d\n", k)
- }
- if k == 0 {
- fmt.Printf("%d = %d x %d\n", a, b, q)
- mbuf = getSuffix(a)
- mbuf = fmt.Sprintf("%s", mbuf)
- /// fmt.Printf("%d%s %d의 배수(mupltiple)이다.\n", a, mbuf, b)
- /// mbuf = getSuffix(b)
- /// fmt.Printf("%d%s %d의 약수(divisor)이다.\n", b, mbuf, a)
- fmt.Printf("%d is a multiple of %d.\n", a, b)
- fmt.Printf("%d is a divisor of %d.\n", b, a)
- } else {
- mbuf = getSuffix(a)
- fmt.Printf("%d = %d x %d + %d\n", a, b, q, r)
- /// fmt.Printf("%d%s %d의 배수(mupltiple)가 아니다.\n", a, mbuf, b)
- fmt.Printf("%d is not a multiple of %d.\n", a, b)
- }
- }
실행> go run makeDivisionTable.go 500210 61
또는
컴파일> go build makeDivisionTable.go
실행> ./makeDivisionTable.go 500210 61
'프로그래밍 > Go' 카테고리의 다른 글
스트링 배열 정렬(sorting)하기 with Go (0) | 2012.06.28 |
---|---|
손으로 계산하는 긴 자리 곱셈표 만들기 with Go (0) | 2012.06.28 |
Go 언어로 3제곱근, 4제곱근, n제곱근 구하기 (0) | 2012.06.27 |
삼각형 출력 예제를 통한 여러 가지 소스 비교 with Go (0) | 2012.06.26 |
7비트 ASCII 코드표 만들기 예제 with Go (0) | 2012.06.25 |