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


  1. /*
  2.  *  Filename: makeDivisionTable.go
  3.  *
  4.  *  Purpose:  Make a division table in a handy written form.
  5.  *
  6.  *  Execute: go run makeDivisionTable 12345 32
  7.  *  Execute: go run makeDivisionTable 500210 61
  8.  *
  9.  *  or
  10.  *
  11.  *  Compile:  go build makeDivisionTable.go
  12.  *  Execute: ./makeDivisionTable 12345 32
  13.  *  Execute:  ./makeDivisionTable 500210 61
  14.  *
  15.  *     Date:  2012/06/27
  16.  *   Author:  PH Kim   [ pkim ((AT)) scripts.pe.kr ]
  17.  */
  18. package main
  19. import (
  20.     "fmt"
  21.     "os"
  22.     "strings"
  23.     "bytes"
  24.     "strconv"
  25. )
  26. func println(s string) {
  27.     fmt.Printf("%s\n", s)
  28. }
  29. func print(s string) {
  30.     fmt.Printf("%s", s)
  31. }
  32. func printUsage() {
  33.     println("Using: makeDivisionTable [numerator] [denominator]");
  34.     println("Make a division table in a handy written form.");
  35.     // println("사용법: makeDivisionTable [피제수] [제수]");
  36.     // println("손으로 작성한 형태의 나눗셈 표를 만들어준다.");
  37. }
  38. // 부동소수점수의 표현이 .0 으로 끝나는 경우 이를 잘라낸다.
  39. // 전체 문자열 표시 너비는 매개변수 width 로 전달받아 처리한다.
  40. func simplify(v float64,width int) string {
  41.     var n, leng int
  42.     var t string = "                               ";
  43.     var tmp string = "                               "
  44.     t = fmt.Sprintf("%g", v)
  45.     n = len(t)
  46.     if (n > 2) && (t[n - 2] == '.') && (t[n - 1] == '0') {
  47.         t = t[:n-2]
  48.     }
  49.     leng = len(t)
  50.     tmp = t
  51.     if leng < width {
  52.         t = string(bytes.Repeat([]byte{' '}, width - leng))
  53.         t += tmp
  54.     }
  55.     return t
  56. }
  57. // 발음상 숫자에 맞는 주어 조사 "은", "는"을 결정한다.
  58. func getSuffix(v int64) string {
  59.     var buf string
  60.     var t int64 = v % 10
  61.     var suffix = "   "
  62.     var tbuf = "  "
  63.     var suf []string = []string { "은",  "는"}
  64.     suffix = suf[0]
  65.     tbuf = fmt.Sprintf("%d", t)
  66.     if strings.ContainsAny("2459", tbuf[0:1]) {
  67.         suffix = suf[1]
  68.     }
  69.     buf = suffix
  70.     return buf
  71. }
  72. func atoi(s string) int64 {
  73.     var n int
  74.     n, _ = strconv.Atoi(s)
  75.     return int64(n)
  76. }
  77. func makeTable(numer int64, denom int64, quotient int64) int64 {
  78.     var sbuf string
  79.     var strNumer string
  80.     var strDenom string
  81.     var strQuotient string
  82.     var strTmpR string;
  83.     var whiteChars string = "                                                                                 ";
  84.     var underbarChars string  = "_________________________________________________________________________________";
  85.     var barChars string  = "---------------------------------------------------------------------------------";
  86.     var offsetSpaces string
  87.     var biasSpaces string
  88.     var uline string;
  89.     var sline string
  90.     var i int
  91.     var lenN int
  92.     var lenD int
  93.     var lenQ int
  94.     var offsetLeft int
  95.     var bias int
  96.     var tmpR int64
  97.     var tmpSub int64
  98.     var oneDigit byte
  99.     strNumer = fmt.Sprintf("%d", numer)
  100.     strDenom = fmt.Sprintf("%d", denom)
  101.     strQuotient = fmt.Sprintf("%d", quotient)
  102.     lenN = len(strNumer)
  103.     lenD = len(strDenom)
  104.     lenQ = len(strQuotient)
  105.     offsetLeft = 3 + lenD + 3;
  106.     bias = lenN - lenQ
  107.     offsetSpaces = whiteChars[:offsetLeft]
  108.     biasSpaces = whiteChars[:bias]
  109.     uline = underbarChars[: lenN + 2]
  110.     sline = barChars[:lenN]
  111.     fmt.Printf("%s%s%d\n", offsetSpaces, biasSpaces, quotient)
  112.     sbuf = offsetSpaces[:offsetLeft - 2]
  113.     fmt.Printf("%s%s\n", sbuf, uline)
  114.     fmt.Printf("   %s ) %s", strDenom, strNumer)
  115.     strTmpR = strNumer[:bias + 1]
  116.     tmpR = atoi(strTmpR)
  117.     tmpSub = 0
  118.     for i = 0; i < lenQ; i++ {
  119.         if strQuotient[i] == '0' {
  120.             if i + 1 < lenQ {
  121.                 oneDigit = strNumer[bias + i + 1]
  122.                 fmt.Printf("%c", oneDigit)
  123.                 sbuf = fmt.Sprintf("%c", oneDigit)
  124.                 strTmpR += sbuf
  125.                 tmpR = atoi(strTmpR)
  126.             }
  127.         } else {
  128.             println("")
  129.             tmpSub = int64(strQuotient[i] - '0') * denom
  130.             fmt.Printf("%s%s\n", offsetSpaces, simplify(float64(tmpSub), bias + i + 1))
  131.             fmt.Printf("%s%s\n", offsetSpaces, sline)
  132.             tmpR = tmpR - tmpSub
  133.             if tmpR == 0 && i + 1 < lenQ {
  134.                 sbuf = whiteChars[:bias + i + 1]
  135.                 fmt.Printf("%s%s", offsetSpaces, sbuf)
  136.             } else {
  137.                 fmt.Printf("%s%s", offsetSpaces, simplify(float64(tmpR), bias + i + 1))
  138.             }
  139.             strTmpR = fmt.Sprintf("%d", tmpR)
  140.             if i + 1 < lenQ {
  141.                 oneDigit = strNumer[bias + i + 1]
  142.                 fmt.Printf("%c", oneDigit)
  143.                 sbuf = fmt.Sprintf("%c", oneDigit)
  144.                 strTmpR += sbuf
  145.                 tmpR = atoi(strTmpR)
  146.             }
  147.         }
  148.     }
  149.     println("")
  150.     return tmpR
  151. }
  152. // Go 언어의 실행 시작 지점
  153. func main() {
  154.     var a, b, q, r, k int64
  155.     var mbuf string
  156.     if len(os.Args) < 3 {
  157.         printUsage()
  158.         // os.Exit(1)
  159.         return
  160.     }
  161.     a = atoi(os.Args[1])
  162.     b = atoi(os.Args[2])
  163.     if a <= 0 {
  164.         /// fmt.Printf("피제수: %d\n", a)
  165.         /// println("피제수는 양의 정수라야 합니다.")
  166.         fmt.Printf("dividend: %d\n", a)
  167.         println("The dividend should be a positive integer.")
  168.         // os.Exit(1)
  169.         return
  170.     }
  171.     if b <= 0 {
  172.         /// fmt.Printf("제수: %d\n", b)
  173.         /// println("제수는 양의 정수라야 합니다.")
  174.         fmt.Printf("divider: %d\n", b)
  175.         println("The divider should be a positive integer.") 
  176.         // os.Exit(1)
  177.         return
  178.     }
  179.     q = a / b
  180.     r = a % b
  181.     /// fmt.Printf("나눗셈 %d ÷ %d 의 결과: ", a, b)
  182.     /// fmt.Printf("몫: %d, ", q)
  183.     /// fmt.Printf("나머지: %d\n", r)
  184.     fmt.Printf("The result of division %d / %d: ", a, b)
  185.     fmt.Printf("quotient: %d, ", q)
  186.     fmt.Printf("remainder: %d\n", r)
  187.     println("")
  188.     k = makeTable(a, b, q)
  189.     if k == r {
  190.         /// fmt.Printf("\n나머지: %d\n", k)
  191.         fmt.Printf("\nRemainder is %d\n", k)
  192.     }
  193.     if k == 0 {
  194.         fmt.Printf("%d = %d x %d\n", a, b, q)
  195.         mbuf = getSuffix(a)
  196.         mbuf = fmt.Sprintf("%s", mbuf)
  197.         /// fmt.Printf("%d%s %d의 배수(mupltiple)이다.\n", a, mbuf, b)
  198.         /// mbuf = getSuffix(b)
  199.         /// fmt.Printf("%d%s %d의 약수(divisor)이다.\n", b, mbuf, a)
  200.         fmt.Printf("%d is a multiple of %d.\n", a, b)
  201.         fmt.Printf("%d is a divisor of %d.\n", b, a)
  202.     } else {
  203.         mbuf = getSuffix(a)
  204.         fmt.Printf("%d = %d x %d + %d\n", a, b, q, r)
  205.         /// fmt.Printf("%d%s %d의 배수(mupltiple)가 아니다.\n", a, mbuf, b)
  206.         fmt.Printf("%d is not a multiple of %d.\n", a, b)
  207.     }
  208. }




실행> go run makeDivisionTable.go 500210 61

또는

컴파일> go build makeDivisionTable.go

실행> ./makeDivisionTable.go 500210 61

The result of division 500210 / 61: quotient: 8200, remainder: 10 8200 ________ 61 ) 500210 488 ------ 122 122 ------ 10 Remainder is 10 500210 = 61 x 8200 + 10 500210 is not a multiple of 61.
Posted by Scripter
,