자바에서 Math.sqrt() 메소드로 제곱근을 구하고,  Math.cbrt() 메소드로 세제곱근을 구하듯이, Go 언어에서도 math.Sqrt() 함수로 제곱근을 구하고,  math.Cbrt() 함수로 세제곱근을 구할 수 있다. 하지만 네제곱근이나 n제곱근을 구할려면 대신, math.Pow() 함수를 사용할 수 밖에 없다.

가령 2의 4제곱근을 구하려면
       math.Pow(2.0, 1.0/4.0)
로 한다. math.Pow() 함수 속에는 정수형 숫자가 허용되지 않기에, 2는 (float64 상수 리터럴) 2.0 으로 표현해야 한다.

5의 세제곱근을 구하려면
        math.Pow(5.0, 1.0/3.0)
로 한다.

Go 언어로 3제곱근, 4제곱근, n제곱근 구하는 예제


소스 파일명: example.go

#include <stdio.h>
package main
import (
     "fmt"
    "math"
)
   
func main() {
  /// fmt.Printf("5의 세제곱근: %.16f\n",  math.Pow(5.0, 1.0/3.0))
  fmt.Printf("The cbrt of 5: %.16f\n",  math.Pow(5.0, 1.0/3.0))
  // 출력 결과: 1.7099759466766968
  // 검산
  /// fmt.Printf("5의 세제곱근의 세제곱: %.16f\n", math.Pow(1.7099759466766968, 3.0))
  fmt.Printf("The cube of cbrt of 5: %.16f\n", math.Pow(1.7099759466766968, 3.0))
  // 출력 결과: 4.9999999999999981
 
  /// fmt.Printf("\n\n\n\t< 2의 n제곱근 표 >\n\n");
  fmt.Printf("\n\n\n\t< Table of two' square roots >\n\n");
  var n float64
  for n = 2.0; n <= 20.0; n++ {
    /// fmt.Printf("2의 %2.0f제곱근 = %.16f\n", n, math.Pow(2.0, 1.0 / n))
    fmt.Printf("The %2.0f-th root of 2 is %.16f\n", n, math.Pow(2.0, 1.0 / n))
  }
}




컴파일 및 실행 결과 화면:

$ go build example.go
$ ./example
5의 세제곱근: 1.7099759466766968
The cbrt of 5: 1.7099759466766968
The cube of cbrt of 5: 4.9999999999999991
 
        < Table of two' square roots >
The  2-th root of 2 is 1.4142135623730951
The  3-th root of 2 is 1.2599210498948732
The  4-th root of 2 is 1.1892071150027210
The  5-th root of 2 is 1.1486983549970351
The  6-th root of 2 is 1.1224620483093730
The  7-th root of 2 is 1.1040895136738123
The  8-th root of 2 is 1.0905077326652577
The  9-th root of 2 is 1.0800597388923061
The 10-th root of 2 is 1.0717734625362931
The 11-th root of 2 is 1.0650410894399627
The 12-th root of 2 is 1.0594630943592953
The 13-th root of 2 is 1.0547660764816467
The 14-th root of 2 is 1.0507566386532194
The 15-th root of 2 is 1.0472941228206267
The 16-th root of 2 is 1.0442737824274138
The 17-th root of 2 is 1.0416160106505838
The 18-th root of 2 is 1.0392592260318434
The 19-th root of 2 is 1.0371550444461919
The 20-th root of 2 is 1.0352649238413776


 

Posted by Scripter
,

콘솔에 삼각형

         *
       * *
      *   *
     *     *
    *       *
   *         *
  *           *
 *             *
*****************


을 출력하는 Go 언어 컨솔 애플리케이션을 만들어 보자. 이런 소스 코드의 작성은 학원이나 학교에서 프로그래밍 입문자에게 과제로 많이 주어지는 것 중의 하나이다. 코끼리를 보거나 만진 사람들이 저마다 그 생김새를 말할 때 제각기 다르게 표현할 수 있듯이 이런 소스 코드의 작성도 알고 보면 얼마든지 많은 방법이 있을 것이다. 여기서는 쉬운 코드 부터 작성해 보고 차츰차츰 소스를 바꾸어 가면서 Go 언어 프로그래밍의 기초부분을 터득해 보기로 한다.

삼각형 출력 부분을 main() 함수에서 하지 않고, 별도로 구현된 printTriange() 함수에서 하기로 한다.

우선 첫번 째 예제는 Go 언어의 컨솔 출력 함수 fmt.Printf() 의 사용법 만 알면 누구나 코딩할 수 있는 매우 단순한 소스 코드이다.


삼각형 출력 예제 1
/*
 *  Filename: printTriangle1.go
 *            Print a triangle on console.
 *
 *  Execute: go run printTriangle1.go
 *  
 *  or
 *  
 *  Compile: go build printTriangle1.go
 *  Execute: ./printTriangle1
 *
 *      Date:  2012/06/26
 *    Author:  PH Kim   [ pkim (AT) scripts.pe.kr ]
 */

package main

import (
    "fmt"
)

func println(s string) {
    fmt.Printf("%s\n", s)
}

func print(s string) {
    fmt.Printf("%s", s)
}

func printTriange() {
    println("        *        ")
    println("       * *       ")
    println("      *   *      ")
    println("     *     *     ")
    println("    *       *    ");
    println("   *         *   ")
    println("  *           *  ")
    println(" *             * ")
    println("*****************")
}

func main() {
    printTriange()
}




위의 소스 코드는 아무 알고리즘도 없는 너무 단순한 코드이다. 이런 코드를 작성했다간 출력 모양이나 크기를 변경해야 하는 상황을 맞이하면 위드프로세서로 문서 만드는 것 이상으로 많은 수작업을 하거나 아니면 포기하는 지경에 이를 수도 있다. 그래서 다음 처럼 좀 더 나은 소스 코드를 작성하였다.



삼각형 출력 예제 2
/*
 *  Filename: printTriangle2.go
 *            Print a triangle on console.
 *
 *  Execute: go run printTriangle2.go
 * 
 *  or
 * 
 *  Compile: go build printTriangle2.go
 *  Execute: ./printTriangle2
 *
 *      Date:  2012/06/26
 *    Author:  PH Kim   [ pkim (AT) scripts.pe.kr ]
 */

package main

import (
    "fmt"
)

func println(s string) {
    fmt.Printf("%s\n", s)
}

func print(s string) {
    fmt.Printf("%s", s)
}

func printTriange() {
    var i, k int
    for i = 0; i < 8; i++ {
        for k = 0;  k < 8 - i; k++ {
            print(" ")
        }
        for k = 0;  k < 2*i + 1; k++ {
            if k == 0 || k == 2*i {
                print("*");
            } else {
                print(" ")
            }
        }
        for k = 0;  k < 8 - i; k++ {
            print(" ")
        }
        println("")
    }
    for i = 0; i < 17; i++ {
        print("*")
    }
    println("")
}

func main() {
    printTriange()
}



위의 소스 코드는 컨솔 출력 함수 fmt.Printf() 와  for 구문을 적절히 사용하여 구현되었다. 숫자 몇 곳만 수정하면 출력되는 삼각형의 크기를 바꿀 수 있다. 한 줄에 출력될 문자를 구성하는 알고리즘은 위의 예제와 근본적으로 같지만 string 타입의 변수를 적절히 사용하여 한 즐씩 출력하는 소스 코드를 다음 예제와 같이 작성해 보았다.



삼각형 출력 예제 3
/*
 *  Filename: printTriangle3.go
 *            Print a triangle on console.
 *
 *  Execute: go run printTriangle3.go
 * 
 *  or
 * 
 *  Compile: go build printTriangle3.go
 *  Execute: ./printTriangle3
 *
 *      Date:  2012/06/26
 *    Author:  PH Kim   [ pkim (AT) scripts.pe.kr ]
 */

package main

import (
    "fmt"
)

func println(s string) {
    fmt.Printf("%s\n", s)
}

func print(s string) {
    fmt.Printf("%s", s)
}

func printTriange() {
    var line string = "                 "
    var pline2 string
    var i int
    pline2 = line[0:8] + "*"
    println(pline2)
    for i = 1; i < 8; i++ {
        pline2 = line[0:8-i] + "*" + line[8-i+1:8]
        pline2 += line[0:i] + "*"
        println(pline2)
    }

    pline2 = ""
    for i = 0; i < 17; i++ {
        pline2 += "*"
    }
    println(pline2)
}

func main() {
    printTriange()




별(*) 문자를 이용하여 삼각형을 출력하는 일은 빈칸  문자와 별 문자를 적당한 좌표(위치)에 촐력하는 일이다. 기본 문자열을 빈칸 만으로로 구성된 문자열로 하고, 이 문자열에 한 두 개의 빈칸을 별(*) 문자로 바꾸어 출력하는 기법으로 작성한 것이 다음 소스 코드이다. 단, 마지막 줄에 츨력될 문자열은 stars라는 별도의 변수로 처리하였다.



삼각형 출력 예제 4
/*
 *  Filename: printTriangle4.go
 *            Print a triangle on console.
 *
 *  Execute: go run printTriangle4.go
 * 
 *  or
 * 
 *  Compile: go build printTriangle4.go
 *  Execute: ./printTriangle4
 *
 *      Date:  2012/06/26
 *    Author:  PH Kim   [ pkim (AT) scripts.pe.kr ]
 */

package main

import (
    "fmt"
)

func println(s string) {
    fmt.Printf("%s\n", s)
}

func print(s string) {
    fmt.Printf("%s", s)
}

func printTriange() {
    var whites string = "                 ";
    var stars string  = "*****************";
    var line2 string
    var i int
    println(whites[0:8]+"*"+whites[9:]);
    for i = 1; i < 8; i++ {
        line2 = whites;
        println(line2[:8-i] + "*"  + line2[8-i+1:8+i] + "*" + line2[8+i+1:]);
    }
    println(stars);
}

func main() {
    printTriange()
}




빈칸 문자를 별(*) 문자로 바꾸기 위해, 위의 소스 코드에서는 line2 변수에 whites 의 스트링 값을 통째로 저장하여 출력하였지만, 다음 소스 코드에서는 line2 변수에 출력될 스트링값을 만든어 저장한 후 line2를 출력하였다.



삼각형 출력 예제 5
/*
 *  Filename: printTriangle5.go
 *            Print a triangle on console.
 *
 *  Execute: go run printTriangle5.go
 * 
 *  or
 * 
 *  Compile: go build printTriangle5.go
 *  Execute: ./printTriangle5
 *
 *      Date:  2012/06/26
 *    Author:  PH Kim   [ pkim (AT) scripts.pe.kr ]
 */

package main

import (
    "fmt"
)

func println(s string) {
    fmt.Printf("%s\n", s)
}

func print(s string) {
    fmt.Printf("%s", s)
}

func printTriange() {
    var whites string = "                 ";
    var stars string  = "*****************";
    var line2 string
    var i int
    var start int = 8
    line2 = whites[0:start]+"*"+whites[start+1:]
    println(line2);
    for i = 1; i < 8; i++ {
        line2 = whites[0:start-i]+"*"+whites[start-i+1:start+i] + "*" + line2[start+i+1:]
        println(line2)
    }
    println(stars)
}

func main() {
    printTriange()
}




출력되는 삼각형이 좌우 대칭이라는 사실에 착안하여, 다음 소스 코드에서는 각 줄을 처음 8자, 중앙 한 문자, 끝 8자(처음 8자의 역순)로 string을 만들어 출력하였다.



삼각형 출력 예제 6
/*
 *  Filename: printTriangle6.go
 *            Print a triangle on console.
 *
 *  Execute: go run printTriangle6.go
 * 
 *  or
 * 
 *  Compile: go build printTriangle6.go
 *  Execute: ./printTriangle6
 *
 *      Date:  2012/06/26
 *    Author:  PH Kim   [ pkim (AT) scripts.pe.kr ]
 */

package main

import (
    "fmt"
)

func println(s string) {
    fmt.Printf("%s\n", s)
}

func print(s string) {
    fmt.Printf("%s", s)
}

func reverse(s string) string {
    var n int = len(s)
    var t string = ""
    var i int
    for i = 0; i < n; i++ {
        t += s[n - i - 1:n-i]
    }
    return t
}

func printTriange() {
    var whites string = "        "
    var stars string  = "********"
    var line2 string
    var i int
    var start int = 8
    line2 = whites + "*" + whites
    println(line2);
    for i = 1; i < 8; i++ {
        line2 = whites[0:start-i]+"*"+whites[start-i+1:]
        print(line2)
        line2 = reverse(line2)
        println(" " + line2)
    }
    println(stars + "*" + stars)
}

func main() {
    printTriange()
}




다음 소스 코드는 한 줄에 출력될 문자열의 데이터를 17비트 이진법 수로 구성하고, 이 이진법수의 비트가 0인 곳에는 빈칸을, 1인 곳에는 별(*)을 출력하는 기법으로 작성되었다.



삼각형 출력 예제 7
/*
 *  Filename: printTriangle7.go
 *            Print a triangle on console.
 *
 *  Execute: go run printTriangle7.go
 * 
 *  or
 * 
 *  Compile: go build printTriangle7.go
 *  Execute: ./printTriangle7
 *
 *      Date:  2012/06/26
 *    Author:  PH Kim   [ pkim (AT) scripts.pe.kr ]
 */

package main

import (
    "fmt"
)

func println(s string) {
    fmt.Printf("%s\n", s)
}

func print(s string) {
    fmt.Printf("%s", s)
}

func convertItoA(num int64, radix int) (ret string) {
    var BASE36 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    var tmp string
    var arr string
    var q, r int64
    var i, n int
    var isNegative bool = false

    if num < 0 {
        isNegative = true
        num = -num
    }
    arr = ""
    q = num
    r = 0

    for q >= int64(radix) {
        r = q % int64(radix)
        q = q / int64(radix)
        tmp = BASE36[r:r+1]
        arr += tmp
    }
    tmp = BASE36[q:q+1]
    arr += tmp
    if isNegative {
        arr += "-"
    }

    n = len(arr)
    for i = 0; i < n; i++ {
        ret += arr[n - i - 1:n-i]
    }
    return ret
}

func convertAtoI(str string, radix int) (ret int64) {
    var isNegative bool = false
    var len int = len(str)
    var c byte
    var i int
    var val int64

    c = str[0]
    if c == '-' {
        isNegative = true
    } else if c >= '0' && c <= '9' {
        ret = int64(c) - int64('0');
    } else if c >= 'A' && c <= 'Z' {
        ret = int64(c - 'A') + 10
    } else if c >= 'a' && c <= 'z' {
        ret = int64(c - 'a') + 10;
    }
    if ret >= int64(radix) {
        println("        Invalid character!")
        return ret
    }

    for i = 1; i < len; i++ {
        c = str[i]
        ret *= int64(radix)
        if c >= '0' && c <= '9' {
            val = int64(c - '0')
        } else if c >= 'A' && c <= 'Z' {
            val = int64(c - 'A') + 10
        } else if c >= 'a' && c <= 'z' {
            val = int64(c - 'a') + 10
        }
        if val >= int64(radix) {
            println("        Invalid character!")
            return ret
        }
        ret += val
    }

    if isNegative {
        ret = -ret
    }
   
    return ret
}

func printTriange() {
    var start int = 0x100
    var total int64 = 0
    var val int64 = int64(start)
    var data string
    var i int
    var k uint

    for k = 0; k < 8; k++ {
        val = int64((start << k) | (start >> k))
        data = convertItoA(val, 2);
        for i = 0; i < 17 - len(data); i++ {
            print(" ")
        }
        for i = 0; i < len(data); i++ {
            if data[i] == '0' {
                print(" ")
            } else {
                print("*")
            }
        }
        println("")
        total |= val
    }
    val = int64((start << 8) | (start >> 8))
    total |= val
    data = convertItoA(total, 2)
    for i = 0; i < 17 - len(data); i++ {
        print(" ")
    }
    for i = 0; i < len(data); i++ {
        if data[i] == '0' {
            print(" ")
        } else {
            print("*")
        }
    }
    println("")
}

func main() {
    printTriange()
}




기본적인 원리는 위의 소스 코드와 같지만 이진법수의 한 비트 마다 한 문자씩 츨력하는 대신에 출력된 한 줄의 문자열을 완성하여 이를 fmt.Printf() 로 출력하는 기법으로 재작성한 것이 다음의 소스 코드이다. 자체 구현된 replaceAll() 함수를 이용하여, 모든 0을 빈칸으로, 모든 1을 별(*) 문자로 바꾸었으며, 별(*) 문자만으로 이루어진 마지막 줄 출력을 위해 변수 total을 준비하였다. for 반복 구문의 블럭 내에서 구문

            total |= val

이 하는 일이 무엇인지 이해할 수 있으면 좋다.




삼각형 출력 예제 8
/*
 *  Filename: printTriangle8.go
 *            Print a triangle on console.
 *
 *  Execute: go run printTriangle8.go
 * 
 *  or
 * 
 *  Compile: go build printTriangle8.go
 *  Execute: ./printTriangle8
 *
 *      Date:  2012/06/26
 *    Author:  PH Kim   [ pkim (AT) scripts.pe.kr ]
 */

package main

import (
    "fmt"
)

func println(s string) {
    fmt.Printf("%s\n", s)
}

func print(s string) {
    fmt.Printf("%s", s)
}

func convertItoA(num int64, radix int) (ret string) {
    var BASE36 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    var tmp string
    var arr string
    var q, r int64
    var i, n int
    var isNegative bool = false

    if num < 0 {
        isNegative = true
        num = -num
    }
    arr = ""
    q = num
    r = 0

    for q >= int64(radix) {
        r = q % int64(radix)
        q = q / int64(radix)
        tmp = BASE36[r:r+1]
        arr += tmp
    }
    tmp = BASE36[q:q+1]
    arr += tmp
    if isNegative {
        arr += "-"
    }

    n = len(arr)
    for i = 0; i < n; i++ {
        ret += arr[n - i - 1:n-i]
    }
    return ret
}

func convertAtoI(str string, radix int) (ret int64) {
    var isNegative bool = false
    var len int = len(str)
    var c byte
    var i int
    var val int64

    c = str[0]
    if c == '-' {
        isNegative = true
    } else if c >= '0' && c <= '9' {
        ret = int64(c) - int64('0');
    } else if c >= 'A' && c <= 'Z' {
        ret = int64(c - 'A') + 10
    } else if c >= 'a' && c <= 'z' {
        ret = int64(c - 'a') + 10;
    }
    if ret >= int64(radix) {
        println("        Invalid character!")
        return ret
    }

    for i = 1; i < len; i++ {
        c = str[i]
        ret *= int64(radix)
        if c >= '0' && c <= '9' {
            val = int64(c - '0')
        } else if c >= 'A' && c <= 'Z' {
            val = int64(c - 'A') + 10
        } else if c >= 'a' && c <= 'z' {
            val = int64(c - 'a') + 10
        }
        if val >= int64(radix) {
            println("        Invalid character!")
            return ret
        }
        ret += val
    }

    if isNegative {
        ret = -ret
    }
   
    return ret
}

func replaceAll(str string, s string, t string) string {
    var val string = ""
    var n int = len(s)
    var i int
    for i = 0; i < len(str); i++ {
        if i + n <= len(str) && str[i:i+n] == s {
            val += t
            i += n -1
        } else {
            val += str[i:i+1]
        }
    }
    return val
}

func printTriange() {
    var zeros string = "00000000"
    var start int = 0x100
    var total int64 = 0
    var val int64 = int64(start)
    var data string
    var line string
    var k uint

    for k = 0; k < 8; k++ {
        val = int64((start << k) | (start >> k))
        data = convertItoA(val, 2)
        line = zeros[0: 17 - len(data)]
        line += data
        line = replaceAll(line, "0", " ")
        line = replaceAll(line, "1", "*")
        println(line)
        total |= val
    }

    val = int64((start << 8) | (start >> 8))
    total |= val;
    line = convertItoA(total, 2)
    line = replaceAll(line, "0", " ")
    line = replaceAll(line, "1", "*")
    println(line)
}

func main() {
    printTriange()
}




심각형의 좌우 대칭성과 []byte 타입의 자료를 이용하여 한 줄씩 출력하는 기법이다.
별(*) 문자만으로 이루어진 마지막 줄 출력을 위해 변수 last를 준비하였다.



삼각형 출력 예제 9
/*
 *  Filename: printTriangle9.go
 *            Print a triangle on console.
 *
 *  Execute: go run printTriangle9.go
 * 
 *  or
 * 
 *  Compile: go build printTriangle9.go
 *  Execute: ./printTriangle9
 *
 *      Date:  2012/06/27
 *    Author:  PH Kim   [ pkim (AT) scripts.pe.kr ]
 */

package main

import (
    "fmt"
    "bytes"
)

func println(s string) {
    fmt.Printf("%s\n", s)
}

func print(s string) {
    fmt.Printf("%s", s)
}

func printTriange() {
    var WIDTH int = 17
    var start int = 8
    var data []byte = bytes.Repeat([]byte{' '}, WIDTH)
    var last []byte = bytes.Repeat([]byte{'*'}, WIDTH)
    var i, k int

    for k = 0; k < WIDTH; k++ {
         data[k] = ' '
         last[k] = ' '
    }
    data[start] = '*'
    last[start] = '*'
    for i = 0; i < WIDTH; i++ {
        fmt.Printf("%c", data[i])
    }
    println("")
    data[start] = ' '

    for k = 1; k < WIDTH/2; k++ {
        data[start - k] = '*'
        last[start - k] = '*'
        data[start + k] = '*'
        last[start + k] = '*'

        for i = 0; i < WIDTH; i++ {
            fmt.Printf("%c", data[i])
        }
        println("")
        data[start - k] = ' '
        data[start + k] = ' '
    }

    last[start - WIDTH/2] = '*'
    last[start + WIDTH/2] = '*'
    for i = 0; i < WIDTH; i++ {
        fmt.Printf("%c", last[i])
    }
    println("")
}

func main() {
    printTriange();
}




다음 예제는 수학에서 xy-좌표평면에 점을 찍듯이 논리 구문

             (x + y - 8 == 0) || (y - x + 8 == 0) || (y - 8 == 0)

가 참이 되는 위치에 별(*) 문자를 표시하는 기법으로 작성된 소스 코드이다.




삼각형 출력 예제 10
/*
 *  Filename: printTriangle10.go
 *            Print a triangle on console.
 *
 *  Execute: go run printTriangle10.go
 * 
 *  or
 * 
 *  Compile: go build printTriangle10.go
 *  Execute: ./printTriangle10
 *
 *      Date:  2012/06/27
 *    Author:  PH Kim   [ pkim (AT) scripts.pe.kr ]
 */

package main

import (
    "fmt"
)

func println(s string) {
    fmt.Printf("%s\n", s)
}

func print(s string) {
    fmt.Printf("%s", s)
}

func printTriange() {
    var a byte
    var x, y int

    for y = 0; y <= 8; y++ {
        for x = 0; x <= 16; x++ {
            if (x + y - 8 == 0) || (y - x + 8 == 0) || (y - 8 == 0) {
                a = '*';
            } else {
                a = ' ';
            }
            fmt.Printf("%c", a)
        }
        println("")
    }
}

func main() {
    printTriange();
}



Posted by Scripter
,

ASCII(애스키)란 American Standard Code for Information Interchange의 줄임글로서, 영문자에 기초한 문자 인코딩이다.  이 문자 인코딩에는 C0 제어문자(C0 control character)도 포함되어 있다.  ( 참고:  ASCII - Wikipedia, the free encyclopedia )

다음은  7bit ASCII 코드표를 만들어 보여주는 Go 언어 소스 코드이다. 소스 코드 중에 진법변환에 필요한 함수

        convertAtoI()
        convertItoA()

의 구현도 포함되어 있다.



  1. /*
  2.  *  Filename: makeAsciiTable.go
  3.  *            Make a table of ascii codes.
  4.  *
  5.  *  Execute: go run makeAsciiTable.go
  6.  *
  7.  *  or
  8.  *
  9.  *  Compile: go build makeAsciiTable.go
  10.  *  Execute: ./makeAsciiTable
  11.  *
  12.  *      Date:  2012/06/25
  13.  *    Author:  PH Kim   [ pkim (AT) scripts.pe.kr ]
  14.  */
  15. package main
  16. import (
  17.     "fmt"
  18.     "os"
  19. )   
  20. func println(s string) {
  21.     fmt.Printf("%s\n", s)
  22. }
  23. func print(s string) {
  24.     fmt.Printf("%s", s)
  25. }
  26. func printUsage() {
  27.     println("Usage: makeAsciiTable")
  28.     println("Make a table of ascii codes.")
  29. }
  30. func convertItoA(num int64, radix int) (ret string) {
  31.     var BASE36 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
  32.     var tmp string
  33.     var arr string
  34.     var q, r int64
  35.     var i, n int
  36.     var isNegative bool = false
  37.     if num < 0 {
  38.         isNegative = true
  39.         num = -num
  40.     }
  41.     arr = ""
  42.     q = num
  43.     r = 0
  44.     for q >= int64(radix) {
  45.         r = q % int64(radix)
  46.         q = q / int64(radix)
  47.         tmp = BASE36[r:r+1]
  48.         arr += tmp
  49.     }
  50.     tmp = BASE36[q:q+1]
  51.     arr += tmp
  52.     if isNegative {
  53.         arr += "-"
  54.     }
  55.     n = len(arr)
  56.     for i = 0; i < n; i++ {
  57.         ret += arr[n - i - 1:n-i]
  58.     }
  59.     return ret
  60. }
  61. func convertAtoI(str string, radix int) (ret int64) {
  62.     var isNegative bool = false
  63.     var len int = len(str)
  64.     var c byte
  65.     var i int
  66.     var val int64
  67.     c = str[0]
  68.     if c == '-' { 
  69.         isNegative = true
  70.     } else if c >= '0' && c <= '9' {
  71.         ret = int64(c) - int64('0');
  72.     } else if c >= 'A' && c <= 'Z' {
  73.         ret = int64(c - 'A') + 10
  74.     } else if c >= 'a' && c <= 'z' {
  75.         ret = int64(c - 'a') + 10;
  76.     }
  77.     if ret >= int64(radix) {
  78.         println("        Invalid character!")
  79.         return ret
  80.     }
  81.     for i = 1; i < len; i++ {
  82.         c = str[i]
  83.         ret *= int64(radix)
  84.         if c >= '0' && c <= '9' {
  85.             val = int64(c - '0')
  86.         } else if c >= 'A' && c <= 'Z' {
  87.             val = int64(c - 'A') + 10
  88.         } else if c >= 'a' && c <= 'z' {
  89.             val = int64(c - 'a') + 10
  90.         }
  91.         if val >= int64(radix) {
  92.             println("        Invalid character!")
  93.             return ret
  94.         }
  95.         ret += val
  96.     }
  97.     if isNegative {
  98.         ret = -ret
  99.     }
  100.     return ret
  101. }
  102. func makeTable() {
  103.      var asc = [...] string {
  104.      "NUL", "SOH", "STX", "ETX", "EOT",
  105.      "ENQ", "ACK", "BEL", "BS", "HT",
  106.      "LF", "VT", "FF", "CR", "SO",
  107.      "SI", "DLE", "DC1", "DC2", "DC3",
  108.      "DC4", "NAK", "SYN", "ETB", "CAN",
  109.      "EM", "SUB", "ESC", "FS", "GS",
  110.      "RS", "US", "Spc"  }
  111.     var control = [...]string{
  112.         "NUL (null)",
  113.         "SOH (start of heading)",
  114.         "STX (start of text)",
  115.         "ETX (end of text)",
  116.         "EOT (end of transmission)",
  117.         "ENQ (enquiry)",
  118.         "ACK (acknowledge)",
  119.         "BEL (bell)",
  120.         "BS  (backspace)",
  121.         "TAB (horizontal tab)",
  122.         "LF  (line feed, NL new line)",
  123.         "VT  (vertical tab)",
  124.         "FF  (form feed, NP new page)",
  125.         "CR  (carriage return)",
  126.         "SO  (shift out)",
  127.         "SI  (shift in)",
  128.         "DLE (data link escape)",
  129.         "DC1 (device control 1)",
  130.         "DC2 (device control 2)",
  131.         "DC3 (device control 3)",
  132.         "DC4 (device control 4)",
  133.         "NAK (negative acknowledge)",
  134.         "SYN (synchronous idle)",
  135.         "ETB (end of trans. block)",
  136.         "CAN (cancel)",
  137.         "EM  (end of medium)",
  138.         "SUB (substitute, EOF end of file)",
  139.         "ESC (escape)",
  140.         "FS  (file separator)",
  141.         "GS  (group separator)",
  142.         "RS  (record separator)",
  143.         "US  (unit separator)"   }
  144.     var sbuf, abuf, tbuf string
  145.     var i, j int
  146.     var c byte
  147.     print("    ");
  148.     for i = 0; i < 8; i++ {
  149.         print("+----")
  150.     }
  151.     print("+")
  152.     println("")
  153.     print("    ")
  154.     print("| 0- ");
  155.     print("| 1- ");
  156.     print("| 2- ");
  157.     print("| 3- ");
  158.     print("| 4- ");
  159.     print("| 5- ");
  160.     print("| 6- ");
  161.     print("| 7- ");
  162.     print("|")
  163.     println("")
  164.     print("+---")
  165.     for i = 0; i < 8; i++ {
  166.         print("+----")
  167.     }
  168.     print("+")
  169.     println("")
  170.     for i = 0; i < 16; i++ {
  171.         tbuf = ""
  172.         sbuf = convertItoA(int64(i), 16)
  173.         tbuf += "| "
  174.         tbuf += sbuf
  175.         tbuf += " "
  176.         for j = 0; j < 8; j++ {
  177.             if j*16 + i <= 32 {
  178.                 abuf = fmt.Sprintf("| %-3s", asc[j*16 + i])
  179.             } else if (j*16 + i == 127) {
  180.                 abuf = fmt.Sprintf("| %-3s", "DEL")
  181.             } else {
  182.                 c = byte(j*16 + i)
  183.                 abuf = fmt.Sprintf("| %2c ", c);
  184.             }
  185.             tbuf += abuf
  186.         }
  187.         tbuf += "|"
  188.         println(tbuf)
  189.     }
  190.     print("+---")
  191.     for i = 0; i < 8; i++ {
  192.         print("+----")
  193.     }
  194.     print("+")
  195.     println("")
  196.     println("")
  197.     for i = 0; i < 16; i++ {
  198.         sbuf = fmt.Sprintf("%-30s",  control[i])
  199.         tbuf = fmt.Sprintf("  %-34s",  control[i+16])
  200.         print(sbuf)
  201.         println(tbuf)
  202.     }
  203. }
  204. func main() {
  205.     if len(os.Args) > 1 &&  os.Args[1] == "-h" {
  206.         printUsage()
  207.         os.Exit(1)
  208.     }
  209.     makeTable()
  210. }




실행> go run makeAsciiTable.go

또는

컴파일> go build makeAsciiTable.go

실행> ./makeAsciiTable

    +----+----+----+----+----+----+----+----+
    | 0- | 1- | 2- | 3- | 4- | 5- | 6- | 7- |
+---+----+----+----+----+----+----+----+----+
| 0 | NUL| DLE| Spc|  0 |  @ |  P |  ` |  p |
| 1 | SOH| DC1|  ! |  1 |  A |  Q |  a |  q |
| 2 | STX| DC2|  " |  2 |  B |  R |  b |  r |
| 3 | ETX| DC3|  # |  3 |  C |  S |  c |  s |
| 4 | EOT| DC4|  $ |  4 |  D |  T |  d |  t |
| 5 | ENQ| NAK|  % |  5 |  E |  U |  e |  u |
| 6 | ACK| SYN|  & |  6 |  F |  V |  f |  v |
| 7 | BEL| ETB|  ' |  7 |  G |  W |  g |  w |
| 8 | BS | CAN|  ( |  8 |  H |  X |  h |  x |
| 9 | HT | EM |  ) |  9 |  I |  Y |  i |  y |
| A | LF | SUB|  * |  : |  J |  Z |  j |  z |
| B | VT | ESC|  + |  ; |  K |  [ |  k |  { |
| C | FF | FS |  , |  < |  L |  \ |  l |  | |
| D | CR | GS |  - |  = |  M |  ] |  m |  } |
| E | SO | RS |  . |  > |  N |  ^ |  n |  ~ |
| F | SI | US |  / |  ? |  O |  _ |  o | DEL|
+---+----+----+----+----+----+----+----+----+

NUL (null)                      DLE (data link escape)
SOH (start of heading)          DC1 (device control 1)
STX (start of text)             DC2 (device control 2)
ETX (end of text)               DC3 (device control 3)
EOT (end of transmission)       DC4 (device control 4)
ENQ (enquiry)                   NAK (negative acknowledge)
ACK (acknowledge)               SYN (synchronous idle)
BEL (bell)                      ETB (end of trans. block)
BS  (backspace)                 CAN (cancel)
TAB (horizontal tab)            EM  (end of medium)
LF  (line feed, NL new line)    SUB (substitute, EOF end of file)
VT  (vertical tab)              ESC (escape)
FF  (form feed, NP new page)    FS  (file separator)
CR  (carriage return)           GS  (group separator)
SO  (shift out)                 RS  (record separator)
SI  (shift in)                  US  (unit separator)



 

Posted by Scripter
,

컴퓨터 프로그래밍에서 꼭 알아두어야 할 주요 진법은 당연히 10진법, 2진법, 8진법, 16진법이다.
다음은  0 에서 15 까지의 정수를 10진법, 2진법, 8진법, 16진법의 표로 만들어 보여주는 Go 언어 소스 코드이다. 진법 변환에 필요한 함수

        convertAtoI(string, radix)
        convertItoA(int64, radix)

를 Go 언어 코드로 자체 작성하여 사용하였다.


  1. /*
  2.  *  Filename: makeRadixTable.go
  3.  *            Show the radix table with 10-, 2-, 8-, 16-radices.
  4.  *
  5.  *  Execute: go run makeRadixTable.go
  6.  *
  7.  *  or
  8.  *
  9.  *  Compile: go build makeRadixTable.go
  10.  *  Execute: ./makeRadixTable
  11.  *
  12.  *      Date:  2012/06/25
  13.  *    Author:  PH Kim   [ pkim (AT) scripts.pe.kr ]
  14.  */
  15. package main
  16. import (
  17.     "fmt"
  18.     "os"
  19. )   
  20. type _TOKEN struct {
  21.     a string
  22.     b string
  23. }
  24. func println(s string) {
  25.     fmt.Printf("%s\n", s)
  26. }
  27. func print(s string) {
  28.     fmt.Printf("%s", s)
  29. }
  30. func printUsage() {
  31.     println("Usage: makeRadixTable")
  32.     println("Show the radix table with 10-, 2-, 8-, 16-radices.")
  33. }
  34. func convertItoA(num int64, radix int) (ret string) {
  35.     var BASE36 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
  36.     var tmp string
  37.     var arr string
  38.     var q, r int64
  39.     var i, n int
  40.     var isNegative bool = false
  41.     if num < 0 {
  42.         isNegative = true
  43.         num = -num
  44.     }
  45.     arr = ""
  46.     q = num
  47.     r = 0
  48.     for q >= int64(radix) {
  49.         r = q % int64(radix)
  50.         q = q / int64(radix)
  51.         tmp = BASE36[r:r+1]
  52.         arr += tmp
  53.     }
  54.     tmp = BASE36[q:q+1]
  55.     arr += tmp
  56.     if isNegative {
  57.         arr += "-"
  58.     }
  59.     n = len(arr)
  60.     for i = 0; i < n; i++ {
  61.         ret += arr[n - i - 1:n-i]
  62.     }
  63.     return ret
  64. }
  65. func convertAtoI(str string, radix int) (ret int64) { 
  66.     var isNegative bool = false
  67.     var len int = len(str)
  68.     var c byte
  69.     var i int
  70.     var val int64
  71.     c = str[0]
  72.     if c == '-' {
  73.         isNegative = true
  74.     } else if c >= '0' && c <= '9' {
  75.         ret = int64(c) - int64('0');
  76.     } else if c >= 'A' && c <= 'Z' {
  77.         ret = int64(c - 'A') + 10
  78.     } else if c >= 'a' && c <= 'z' {
  79.         ret = int64(c - 'a') + 10;
  80.     }
  81.     if ret >= int64(radix) {
  82.         println("        Invalid character!")
  83.         return ret
  84.     }
  85.     for i = 1; i < len; i++ {
  86.         c = str[i]
  87.         ret *= int64(radix)
  88.         if c >= '0' && c <= '9' {
  89.             val = int64(c - '0')
  90.         } else if c >= 'A' && c <= 'Z' {
  91.             val = int64(c - 'A') + 10
  92.         } else if c >= 'a' && c <= 'z' {
  93.             val = int64(c - 'a') + 10
  94.         }
  95.         if val >= int64(radix) {
  96.             println("        Invalid character!")
  97.             return ret
  98.         }
  99.         ret += val
  100.     }
  101.     if isNegative {
  102.         ret = -ret
  103.     }
  104.     return ret
  105. }
  106. func makeTable() {
  107.     var sbuf, abuf, tbuf string
  108.     var i int
  109.     for i = 0; i < 4; i++ {
  110.         print("+-------")
  111.     }
  112.     print("+")
  113.     println("")
  114.     print("|  Dec")
  115.     print("\t|   Bin")
  116.     print("\t|  Oct")
  117.     print("\t|  Hex  |")
  118.     println("")
  119.     for i = 0; i < 4; i++ {
  120.         print("+-------")
  121.     }
  122.     print("+")
  123.     println("")
  124.     for i = 0; i < 16; i++ {
  125.         sbuf = fmt.Sprintf("|   %2d", i)
  126.         abuf = convertItoA(int64(i), 2)
  127.         tbuf = fmt.Sprintf("\t|  %4s", abuf)
  128.         sbuf += tbuf
  129.         abuf = convertItoA(int64(i), 8)
  130.         tbuf = fmt.Sprintf("\t|   %2s", abuf)
  131.         sbuf += tbuf
  132.         abuf = convertItoA(int64(i), 16)
  133.         tbuf = fmt.Sprintf("\t|    %-2s |", abuf)
  134.         sbuf += tbuf
  135.         println(sbuf)
  136.     }
  137.     for i = 0; i < 4; i++ {
  138.         print("+-------");
  139.     }
  140.     print("+")
  141.     println("")
  142. }
  143. func main() {
  144.     if len(os.Args) > 1 &&  os.Args[1] == "-h" {
  145.         printUsage()
  146.         os.Exit(1)
  147.     }
  148.     makeTable()
  149. }



실행> go run akeRadixTable.go

컴파일> go build makeRadixTable.go

실행> ./makeRadixTable

+-------+-------+-------+-------+
|  Dec  |   Bin |  Oct  |  Hex  |
+-------+-------+-------+-------+
|    0  |     0 |    0  |    0  |
|    1  |     1 |    1  |    1  |
|    2  |    10 |    2  |    2  |
|    3  |    11 |    3  |    3  |
|    4  |   100 |    4  |    4  |
|    5  |   101 |    5  |    5  |
|    6  |   110 |    6  |    6  |
|    7  |   111 |    7  |    7  |
|    8  |  1000 |   10  |    8  |
|    9  |  1001 |   11  |    9  |
|   10  |  1010 |   12  |    A  |
|   11  |  1011 |   13  |    B  |
|   12  |  1100 |   14  |    C  |
|   13  |  1101 |   15  |    D  |
|   14  |  1110 |   16  |    E  |
|   15  |  1111 |   17  |    F  |
+-------+-------+-------+-------+



 

Posted by Scripter
,

다음은  대화형 모드(interactive mode)에서 진법 변환(radix conversion)하는 Go 언어 소스 코드이다.
메뉴는 주메뉴 Command: (S)et radix, (A)bout, (Q)uit or E(x)it
와 부메뉴 SubCommand: 'main()' to goto Main menu, 'exit()' or 'quit()' to exit
로 구성되어 있으며, 진법 변환을 하는 핵심 함수 convertAtoI()와 convertItoA()의 소스가 자체 제작되어 포함되어 있다. 이를 이용하는 부분은 152~153째 줄에 있는 

         val = convertAtoI(s, srcRdx) 
         ret = convertItoA(val, destRdx)

이다. 지원되는 진법은 2진법에서 36진법 까지이다.
    



  1. /*
  2.  *  Filename: convertRadix.go
  3.  *
  4.  *            Convert radix in a interactive mode.
  5.  *
  6.  *  Execute: go run convertRadix.go
  7.  *
  8.  *  or
  9.  *
  10.  *  Compile: go build convertRadix.go
  11.  *  Execute: ./convertRadix
  12.  *
  13.  *      Date:  2012/06/25
  14.  *    Author:  PH Kim   [ pkim (AT) scripts.pe.kr ]
  15.  */
  16. package main
  17. import (
  18.     "fmt"
  19.     "bufio"
  20.     "os"
  21.     "strings"
  22. )   
  23. type _TOKEN struct {
  24.     a string
  25.     b string
  26. }
  27. func println(s string) {
  28.     fmt.Printf("%s\n", s)
  29. }
  30. func print(s string) { 
  31.     fmt.Printf("%s", s)
  32. }
  33. func printUsage() {
  34.     println("Usage: convertRadix")
  35.     println("Convert radix in an interactive mode, where the maximum radix is 36.")
  36. }
  37. func printAbout() {
  38.     println("    About: Convert radix in a interactive mode.")
  39. }
  40. func printMainMenu() {
  41.     println("  Command: (S)etup radix, (A)bout, (Q)uit or E(x)it")
  42. }
  43. func printMainPrompt() {
  44.     print("  Prompt> ")
  45. }
  46. func printSubMenu(srcRadix int, destRadix int) {
  47.     var sbuf string
  48.     fmt.Sprintf(sbuf, "    Convert Radix_%d to Radix_%d", srcRadix, destRadix);
  49.     println(sbuf);
  50.     println("    SubCommand: 'main()' to goto Main menu, 'exit()' or 'quit()' to exit");
  51. }
  52. func printSubPrompt() {
  53.     print("    Input Value>> ");
  54. }
  55. func convertItoA(num int64, radix int) (ret string) {
  56.     var BASE36 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
  57.     var tmp string
  58.     var arr string
  59.     var q, r int64
  60.     var i, n int
  61.     var isNegative bool = false
  62.     if num < 0 {
  63.         isNegative = true
  64.         num = -num
  65.     }
  66.     arr = ""
  67.     q = num
  68.     r = 0
  69.     for q >= int64(radix) {
  70.         r = q % int64(radix)
  71.         q = q / int64(radix)
  72.         tmp = BASE36[r:r+1]
  73.         arr += tmp
  74.     }
  75.     tmp = BASE36[q:q+1]
  76.     arr += tmp
  77.     if isNegative {
  78.         arr += "-"
  79.     }
  80.     n = len(arr)
  81.     for i = 0; i < n; i++ {
  82.         ret += arr[n - i - 1:n-i]
  83.     }
  84.     return ret
  85. }
  86. func convertAtoI(str string, radix int) (ret int64) {
  87.     var isNegative bool = false
  88.     var len int = len(str)
  89.     var c byte
  90.     var i int
  91.     var val int64
  92.     c = str[0]
  93.     if c == '-' {
  94.         isNegative = true
  95.     } else if c >= '0' && c <= '9' {
  96.         ret = int64(c) - int64('0')
  97.     } else if c >= 'A' && c <= 'Z' {
  98.         ret = int64(c - 'A') + 10
  99.     } else if c >= 'a' && c <= 'z' {
  100.         ret = int64(c - 'a') + 10
  101.     }
  102.     if ret >= int64(radix) {
  103.         println("        Invalid character!")
  104.         return ret
  105.     }
  106.     for i = 1; i < len; i++ {
  107.         c = str[i]
  108.         ret *= int64(radix)
  109.         if c >= '0' && c <= '9' {
  110.             val = int64(c - '0')
  111.         } else if c >= 'A' && c <= 'Z' {
  112.             val = int64(c - 'A') + 10
  113.         } else if c >= 'a' && c <= 'z' {
  114.             val = int64(c - 'a') + 10
  115.         }
  116.         if val >= int64(radix) {
  117.             println("        Invalid character!")
  118.             return ret
  119.         }
  120.         ret += val
  121.     }
  122.     if isNegative {
  123.         ret = -ret
  124.     }
  125.     return ret
  126. }
  127. func convertRadix(s string, srcRdx  int, destRdx int) (ret string) {
  128.     var val int64
  129.     val = convertAtoI(s, srcRdx)
  130.     ret = convertItoA(val, destRdx)
  131.     return ret
  132. }
  133. func readLine() (data string) {
  134.     fmt.Scanf(data, "%s") //
  135.     return data
  136. }
  137. func readTwo() (token _TOKEN) { 
  138.     token.a = ""
  139.     token.b = ""
  140.     fmt.Scanf("%s %s", &token.a, &token.b)    // call twice, is It a bug?
  141.     fmt.Scanf("%s %s", &token.a, &token.b)    // call twice, is It a bug?
  142.     return token
  143. }
  144. func tokenize(ptoken _TOKEN, line string, c byte) {
  145.     var i int
  146.     var from, to int
  147.     i = 0
  148.     for line[i] != c {
  149.         i += 1
  150.     }
  151.     from = i
  152.     for line[i] == c {
  153.         i += 1
  154.     }
  155.     to = i
  156.     ptoken.a = line[0: to - from]
  157.     for line[i] != c {
  158.         i += 1
  159.     }
  160.     from = i
  161.     for line[i] == c {
  162.         i += 1
  163.     }
  164.     to = i
  165.     ptoken.b = line[0: to - from]
  166. }
  167. func doConvert(srcRadix int,destRadix int) {
  168.     var sbuf string
  169.     var cmd string
  170.     var srcStr string
  171.     var destStr string
  172.     println("")
  173.     printSubMenu(srcRadix, destRadix)
  174.     for {
  175.         printSubPrompt()
  176.         cmd = ""
  177.         fmt.Scanf("%s", &cmd)        // call twice, is It a bug?
  178.         for cmd == "" {
  179.             fmt.Scanf("%s", &cmd)       // call twice, is It a bug?
  180.         }
  181.         if cmd == "main()" {
  182.             return
  183.         } else if cmd == "exit()" || cmd == "quit()" {
  184.             os.Exit(0)
  185.         } '
  186.         srcStr = cmd
  187.         destStr = convertRadix(srcStr, srcRadix, destRadix)
  188.         sbuf = fmt.Sprintf("        ( %s )_%d   --->   ( %s )_%d", srcStr, srcRadix, destStr, destRadix);
  189.         println(sbuf)
  190.         println("")
  191.     }
  192. }
  193. func doStart() { 
  194.     var srcRadix int = 10
  195.     var destRadix int = 10 
  196.     var st _TOKEN
  197.     var onlyOnce bool = true
  198.     for {
  199.         println("")
  200.         if onlyOnce {
  201.             println("  The supported maximum radix is 36.")
  202.             onlyOnce = false
  203.         }
  204.         printMainMenu()
  205.         printMainPrompt()
  206.         var cmd string = ""
  207.         fmt.Scanf("%s", &cmd)    // call twice, is It a bug?
  208.         fmt.Scanf("%s", &cmd)    // call twice, is It a bug?
  209.         if  len(cmd) == 1&& strings.IndexAny("qQxX", cmd) >= 0 {
  210.             os.Exit(0)
  211.         }  else if len(cmd) == 1&& strings.IndexAny("aA", cmd) >= 0 {
  212.             printAbout()
  213.         }  else if len(cmd) == 1&& strings.IndexAny("sS", cmd) >= 0 {
  214.             print("  Input the source and target radices (say, 16 2): ") 
  215.             st = readTwo()
  216.             srcRadix = int(convertAtoI(st.a, 10))
  217.             destRadix = int(convertAtoI(st.b, 10))
  218.             doConvert(srcRadix, destRadix)
  219.         }
  220.     }
  221. }
  222. func waitCommand(str string) string {
  223.         print(str)
  224.         reader := bufio.NewReader(os.Stdin)
  225.         input, _ := reader.ReadString('\n')
  226.         if len(input) > 0 && input[len(input) -1] == '\n' {
  227.             input = input[0:len(input) -1]
  228.         }
  229.         if len(input) > 0 && input[len(input) -1] == '\r' {
  230.             input = input[0:len(input) -1]
  231.         }
  232.         return input
  233. }
  234. func main() {
  235.     if len(os.Args) > 1 &&  os.Args[1] == "-h" {
  236.         printUsage()
  237.         return
  238.     }
  239.     doStart()
  240. }




실행> go run convertRadix.go

또는

컴파일> go build convertRadix.go
실행> ./convertRadix

  The supported maximum radix is 36.
  Command: (S)etup radix, (A)bout, (Q)uit or E(x)it
  Prompt> s
  Input the source and target radices (say, 16 2): 8 16

    Convert Radix_8 to Radix_16
    SubCommand: 'main()' to goto Main menu, 'exit()' or 'quit()' to exit
    Input Value>> 1234
        ( 1234 )_8   --->   ( 29C )_16

    Input Value>> main()

  Command: (S)etup radix, (A)bout, (Q)uit or E(x)it
  Prompt> s
  Input the source and target radices (say, 16 2): 16 8

    Convert Radix_16 to Radix_8
    SubCommand: 'main()' to goto Main menu, 'exit()' or 'quit()' to exit
    Input Value>> 29c
        ( 29c )_16   --->   ( 1234 )_8

    Input Value>> exit()



Posted by Scripter
,

다음은  이차방정식 x^2 - x - 1 = 0 의 양의 근 즉 황금비율(golden ratio)을 구하는 Go 애플리케이션 소스이다. 황금비율을 구하는 비례방정식은 1 : x = x : (x+1) 이며, 이를 이차방정식으로 표현한 것이 x^2 - x - 1 = 0 이다.

See:  Golden ratio - Sajun.org

* Go 프로그램 소스는 (한글이 주석에만 포함되어 있더러도) UTF-8 인코딩으로 저장해야 한다.

  1. /*
  2.  *  Filename: testGoldenRatio.go
  3.  *    황금률(즉, 이차방정식 x^2 - x - 1  = 0 의 양의 근)을 계산한다.
  4.  *
  5.  *   Execute: go run testGoldenRatio.go
  6.  *
  7.  *   or
  8.  *
  9.  *   Compile: go build testGoldenRatio.go
  10.  *   Execute: ./testGoldenRatio
  11.  *
  12.  *      Date:  2012/06/20
  13.  *    Author:  PH Kim   [ pkim (AT) scripts.pe.kr ]
  14.  */
  15. package main
  16. import (
  17.     "fmt"
  18.     "os"
  19.     "math"
  20. )
  21. type PAIR struct {
  22.     x1 float64
  23.     x2 float64
  24. }
  25. func printUsing() {
  26.     fmt.Printf("Using: testGoldenRatio [-h|-help]\n")
  27.     fmt.Printf("This calculates the value of the golden ratio.\n")
  28. }
  29. // 이차방정식 a x^2 + b x + c  = 0 의 근을 구한다.
  30. func findQuadraticRoot(a float64, b float64, c float64) (zeros PAIR) {
  31.     if a == 0.0 {
  32.         fmt.Printf("Since the highest coefficient is zero, the given equation is not a quadratic equation.\n")
  33.         return
  34.     } else if b*b - 4*a*c < 0.0 {
  35.         fmt.Printf("Since the discriminant %f is negative, the given equation has no real root.\b", b*b - 4*a*c)
  36.         return
  37.     }
  38.     zeros.x1 = (-b + math.Sqrt(b*b - 4*a*c)) / (2.0 * a)
  39.     zeros.x2 = (-b - math.Sqrt(b*b - 4*a*c)) / (2.0 * a)
  40.     return
  41. }
  42. func main() {
  43.     var x1, x2 float64
  44.     if len(os.Args) > 1 && (os.Args[1] == "-h" || os.Args[1] == "-help") {
  45.         printUsing()
  46.         return
  47.     }
  48.    var  values = findQuadraticRoot(1.0, -1.0, -1.0)
  49.     x1 = values.x1
  50.     x2 = values.x2
  51.     if x1 >= x2 {
  52.         fmt.Printf("The bigger root is %f, \n", x1);
  53.         fmt.Printf("and the less root is %f.\n", x2);
  54.     } else {
  55.         fmt.Printf("The bigger root is %f, \n", x2);
  56.         fmt.Printf("and the less root is %f.\n", x1);
  57.     }
  58. }



컴파일> go build testGoldenRatio.go

실행> ./testGoldenRatio
The bigger root is 1.618034,
and the less root is -0.618034.


go run 명령을 이용하면 소스 코드를 직접 실행시킬 수 있다.

실행> go run testGoldenRatio.go
The bigger root is 1.618034,
and the less root is -0.618034.



Posted by Scripter
,

아래의 소스 testBigInt.go 는 GMP 사용 예제 for C 의 testGMP.c 를 Go 언어 용으로 수정한 것이다.

Go 언어는 (C 언어와 달리) 긴 자리 정수 타입을 빌트인 패키지로 내장하고 있다. 긴 자리 정수 타입을 사용하기 위해서는 (소스 파일의 선두에) "math/big" 패키지를 미리 임포트(수입)해야 한다.

 

  1. /*
  2.  *  Filename: testBigInt.go
  3.  *
  4.  *   Compile: go build testBigInt.go
  5.  *   Execute: ./testBigInt
  6.  *
  7.  *  or
  8.  *
  9.  *   Execute without compiling: go run testBigInt.go
  10.  *
  11.  *    Output: 2470450
  12.  */
  13. package main
  14. import (
  15.     "fmt"
  16.     "math/big"
  17. )   
  18. func foo(param *big.Int, n int64) *big.Int{
  19.     var i int64
  20.     var r *big.Int = big.NewInt(1)
  21.     r.Mul(param, big.NewInt(n))
  22.     for i = 1; i < n; i++ { 
  23.         r.Add(r, big.NewInt(i*7))
  24.     }
  25.     return r
  26. }
  27. func main() {
  28.     var r *big.Int;
  29.     /// var n *big.Int = big.NewInt(123456)
  30.     var n *big.Int = big.NewInt(1)
  31.     n.SetInt64(123456)
  32.     r = foo(n, 20)
  33.     fmt.Printf("%s\n", r)
  34. }



실행> go run testBigInt,go
2470450


컴파일> go build testBigInt.go
실행> ./testBigInt
2470450




Posted by Scripter
,

현재 시각을 컨솔에 보여주는 간단한 애플리케이션의 Go 언어 소스 코드이다.
UTC란 1970년 1월 1일 0시 0분 0초를 기준으로 하여 경과된 초 단위의 총 시간을 의미한다.
* UTC(Universal Time  Coordinated, 협정세계시, 協定世界時)

  1. /*
  2.  *  Filename: testCTime.go
  3.  *
  4.  *  Compile:  go build  testCTime.go
  5.  *  Execute:  ./testCTime
  6.  *
  7.  *  Execute without compiling:  go run  testCTime.go
  8.  *
  9.  *  Date:  2012. 6. 18.
  10.  */
  11. package main
  12. import (
  13.     "fmt"
  14.     "time"
  15.     "math"
  16. )
  17. func main() {
  18.     var weekNames []string = []string {  "일", "월", "화", "수", "목", "금", "토" };     // Hangul
  19.     // 1970년 1월 1일 0시 0분 0초부터 시작하여 현재까지의 초
  20.     t1 := time.Now()
  21.     fmt.Printf("UTC: %d초\n", t1.Unix())   // Hangul
  22.     /// fmt.Printf("UTC: %dsec\n", t1.Unix())      // Engliish
  23.     // 현재 시각 표시: 200x년 x월 xx일 (x요일) xx시 xx분 xx초
  24.     fmt.Printf("%d년 %d월 %d일 (%s요일) ", t1.Year(), t1.Month(), t1.Day(), weekNames[t1.Weekday()]);     // Hangul
  25.     fmt.Printf("%d시 %d분 %d초\n", t1.Hour(), t1.Minute(), t1.Second());    // Hangul
  26.     /// fmt.Printf("%04d-%02d-%02d (%s) ", t1.Year(), t1.Month(), t1.Day(), t1.Weekday());     // English
  27.     /// fmt.Printf("%02d:%02d:%02d\n", t1.Hour(), t1.Minute(), t1.Second());     // English
  28.     var y1 = t1.Year()
  29.     var t2 = time.Date(y1,1,1,0,0,0, 0, t1.Location());
  30.     var dAfter int = int(math.Floor(t1.Sub(t2).Hours()/24.0)) + 1
  31.     fmt.Printf("올해 몇 번째 날: %d\n", dAfter);     // Hangul
  32.     /// fmt.Printf("Today is the %d-th day in this year.\n", dAfter);     // English
  33. }



컴파일> go build testCTime.go

실행> ./testCTime
UTC: 1339945637초
2012년 6월 18일 (월요일) 0시 7분 217초
올해 몇 번째 날: 170



Posted by Scripter
,

다항식 p(x) 를 1차 다항식 x - a 로 나눌 때의 몫과 나머지를 구하는 조립제법을 Go 언어로 구현해 보았다. 조립제법(synthetic division)은 일명 Horner의 방법이라고도 불리우는데, 이는
다항식 p(x)의 x = a 일 때의 값 p(a)을 계산하는 가장 빠른 알고리즘이기도 하다.

         p(x) = (x - a)q(x) + r

여기서 r은 나머지이며 r = p(a) 이다. 또 q(x)는 몫이다.

[참고]
    * 온라인으로 조립제법 표 만들기 손으로 계산하는 조립제법 표 
    * 온라인으로 구하는 다항식의 도함수: 조립제법을 이용한 다항식의 도함수


아래의 소스파일은 go run 명령을 사용하면 컴파일 과정 없이 그대로 실행된다.
(실행 예:  go run testSyntheticDivision.go 1 2 3 4 5  )


  1. /*
  2.  *  Filename: testSyntheticDivision.go
  3.  *
  4.  *  Purpose:  Find the quotient and remainder when some polynomial is
  5.  *            divided by a monic linear polynomial.
  6.  *
  7.  *  Execute:  go run testSyntheticDivision.go -2 1 3 3 1
  8.  *
  9.  *  or
  10.  *
  11.  *  Compile:  go build testSyntheticDivision.go
  12.  *  Execute:  ./testSyntheticDivision -2 1 3 3 1
  13.  */
  14. package main
  15. import (
  16.     "fmt"
  17.     "os"
  18.     "strconv"
  19.     "math"
  20. )
  21. func print(str string) {
  22.     fmt.Printf("%s", str);
  23. }
  24. func println(str string) {
  25.     fmt.Printf("%s\n", str);
  26. }
  27. // 사용법 표시
  28. func printUsage() {
  29.      /// println("사용법: testSyntheticDivision [수] [피제식의 계수들]");
  30.      /// println("조립제법(synthetic method)에 의한 다항식 나눗셈 결과를 보여준다.");
  31.      println("Usage: testSyntheticDivision [number] [coefficients of dividend]");
  32.      println("Show the result of synthetic division.");
  33. }
  34. // 부동소수점수의 표현이 .0 으로 끝나는 경우 이를 잘라낸다.
  35. // 전체 문자열 표시 너비는 매개변수 width 로 전달받아 처리한다.
  36. func simplify(v float64, width int) string {
  37.     var n int
  38.     var slen int
  39.     var t string = "                               ";
  40.     var tmp string = "                               ";
  41.     t = fmt.Sprintf("%g", v);
  42.     n = len(t);
  43.     if (n > 2) && (t[n - 2] == '.') && (t[n - 1] == '0') {
  44.         t = t[0:n-2]
  45.     }
  46.     slen = len(t);
  47.     tmp =  t
  48.     if (slen < width) {
  49.         t = "               "
  50.         t = t[0:width - slen]
  51.         t = t + tmp
  52.     }
  53.     return t
  54. }
  55. // 다항식을 내림차순의 문자열로로 반환하는 함수
  56. func toPolyString(c []float64, size int) string {
  57.     var SIZE int = size;
  58.     var i int;
  59.     var t string = ""
  60.     var tmp string
  61.     var pc string = simplify(c[0], -1);
  62.     var pci string
  63.     if SIZE > 2 {
            if (len(pc) == 1 && pc[0] == '1') {
  64.             t = fmt.Sprintf("x^%d", SIZE - 1);
  65.         } else if (len(pc) == 2 && pc[0] == '-' && pc[1] == '1') {
  66.             t = fmt.Sprintf("-x^%d", SIZE - 1);
  67.         } else {
  68.             t = fmt.Sprintf("%s x^%d", simplify(c[0], -1), SIZE - 1);
  69.         }
  70.     } else if SIZE == 2 {
  71.         if (len(pc) == 1 && pc[0] == '1') {
  72.             t = "x"
  73.         } else if (len(pc) == 2 && pc[0] == '-' && pc[1] == '1') {
  74.             t = "-x"
  75.         } else {
  76.             t = fmt.Sprintf("%s x", simplify(c[0], -1));
  77.         }
  78.     } else if SIZE == 1 {
  79.         t = fmt.Sprintf("%s", simplify(c[0], -1));
  80.     }
  81.     for i = 1; i < SIZE; i++ {
  82.         pci = simplify(c[i], -1);
  83.         if SIZE - 1 - i > 1 {
  84.             if c[i] > 0.0 {
  85.                 if len(pci) == 1 && pci[0] == '1' {
  86.                     tmp = fmt.Sprintf(" + x^%d", SIZE - 1 - i);
  87.                     t += tmp
  88.                 } else {
  89.                     tmp = fmt.Sprintf(" + %s x^%d", simplify(c[i], -1), SIZE - 1 - i);
  90.                     t += tmp
  91.                 }
  92.             } else if c[i] < 0.0 {
  93.                 if len(pci) == 2 && pci[0] == '-' && pci[1] == '1' {
  94.                     tmp = fmt.Sprintf(" - x^%d", SIZE - 1 - i);
  95.                     t += tmp
  96.                 } else {
  97.                     tmp = fmt.Sprintf(" - %s x^%d", simplify(math.Abs(c[i]), -1), SIZE - 1 - i);
  98.                     t += tmp
  99.                 }
  100.             }
  101.         } else if SIZE - 1 - i == 1 {
  102.             if c[i] > 0.0 {
  103.                 if len(pci) == 1 && pci[0] == '1' {
  104.                     t += " + x"
  105.                 } else {
  106.                     tmp = fmt.Sprintf(" + %s x", simplify(c[i], -1));
  107.                     t += tmp
  108.                 }
  109.             } else if c[i] < 0.0 {
  110.                 if len(pci) == 2 && pci[0] == '-' && pci[1] == '1' {
  111.                     t += " - x"
  112.                 } else {
  113.                     tmp = fmt.Sprintf(" - %s x", simplify(math.Abs(c[i]), -1));
  114.                     t += tmp
  115.                 }
  116.             }
  117.         } else if SIZE - 1 - i == 0 {
  118.             if c[i] > 0.0 {
  119.                 tmp = fmt.Sprintf(" + %s", simplify(c[i], -1));
  120.                 t += tmp
  121.             } else if (c[i] < 0.0) {
  122.                 tmp = fmt.Sprintf(" - %s", simplify(math.Abs(c[i]), -1));
  123.                 t += tmp
  124.             }
  125.         }
  126.     }
  127.     return t
  128. }
  129. // 다향식 나눗셈 결과를
  130. //     (피제식) = (제식)(몫) + (나마지)
  131. // 형태로 출력
  132. func printDivisionResult(a float64, c []float64, b []float64, size int) {
  133.     var SIZE int = size;
  134.     var i int
  135.     var r float64
  136.     var monic []float64 = []float64 { 1.0, 0.0 };
  137.     print("  ");
  138.     print(toPolyString(c, SIZE));
  139.     println("");
  140.     print("    = ( ");
  141.     monic[1] = -a;
  142.     print(toPolyString(  monic, 2 ));
  143.     print(" )")
  144.     var pTmpPoly []float64 = make([]float64, SIZE);
  145.     for i = 0; i < SIZE - 1; i++ {
  146.         pTmpPoly[i] = b[i];
  147.     }
  148.     print("( ");
  149.     print(toPolyString(pTmpPoly, SIZE - 1));
  150.     print(" )");
  151.     r = b[SIZE - 1];
  152.     if r > 0.0 {
  153.         print(" + ");
  154.         print(simplify(r, -1));
  155.     } else if (r < 0.0) {
  156.         print(" - ");
  157.         print(simplify(math.Abs(r), -1));
  158.     }
  159.     println("");
  160. }
  161. // 조립제법 계산표 출력 함수
  162. func printSyntheticTable(a float64, c []float64, s []float64, q []float64, size int) {
  163.     var SIZE int = size;
  164.     var i int
  165.     print("       | ");
  166.     print(simplify(c[0], 6));
  167.     for i = 1; i < SIZE; i++ {
  168.         print("  ");
  169.         print(simplify(c[i], 6));
  170.     }
  171.     println("");
  172.     print(simplify(a, 6));
  173.     print(" | "); 
  174.    print("        ");
  175.     print(simplify(s[1], 6));
  176.     for i = 2; i < SIZE; i++ {
  177.         print("  ");
  178.         print(simplify(s[i], 6));
  179.     }
  180.     println("");
  181.     print("       |-");
  182.     for i = 0; i < SIZE; i++ {
  183.         print("--------");
  184.     }
  185.     println("");
  186.     print("         ");
  187.     print(simplify(q[0], 6));
  188.     for i = 1; i < SIZE; i++ {
  189.         print("  ");
  190.         print(simplify(q[i], 6));
  191.     }
  192.     println("");
  193. }
  194. // Go 언어 프로그램의 실행 시작 지점
  195. func main() {
  196.     var i int
  197.     var SIZE = len(os.Args) - 2
  198.     var a float64
  199.     var c []float64 = make([]float64, SIZE + 2)
  200.     var s []float64 = make([]float64, SIZE + 2)
  201.     var b []float64 = make([]float64, SIZE + 2)
  202.     if len(os.Args) < 4 {
  203.         printUsage()
  204.         return
  205.     }
  206.     //////////////////////////////////////////////////////
  207.     // 피제식은 c_0 x^n +  c_1 x^(n -1) + ... + c_n
  208.     // 제식은 x -  a
  209.     a, _ = strconv.ParseFloat(os.Args[1], 64)
  210.     for i = 0; i < SIZE; i++ {
  211.         c[i], _ = strconv.ParseFloat(os.Args[i + 2], 64)
  212.     }
  213.     //////////////////////////////////////////////////////
  214.     // 조립제법의 주요 부분
  215.     s[0] = 0.0;
  216.     b[0] = c[0];
  217.     for i = 1; i < SIZE; i++ {
  218.         s[i] = b[i-1]*a;
  219.         b[i] = c[i] + s[i];
  220.     }
  221.     //////////////////////////////////////////////////////
  222.     // 몫의 계수와 나머지를 출력한다.
  223.     /// print("몫의 계수는 ");
  224.     print("The coefficients of the quotient are ");
  225.     for i = 0; i < SIZE - 2; i++ {
  226.         print(simplify(b[i], -1));
  227.         print(", ");
  228.     }
  229.     print(simplify(b[SIZE - 2], -1));
  230.     // print(" 이고, 나머지는 ");
  231.     print("\nand the remainder is ");
  232.     print(simplify(b[SIZE - 1], -1));
  233.     /// println(" 이다.");
  234.     println(".");
  235.     println("");
  236.     //////////////////////////////////////////////////////
  237.     // 조립제법 표를 출력한다.
  238.     printSyntheticTable(a, c, s, b, SIZE);
  239.     println("");
  240.     //////////////////////////////////////////////////////
  241.     // (피제식) = (제식) x (몫) + (나머지)
  242.     printDivisionResult(a, c, b, SIZE);
  243. }




실행> go run testSyntheticDivision.go 1 2 3 4 5
The coefficients of the quotient are 2, 5, 9
and the remainder is 14.

       |      2       3       4       5
     1 |              2       5       9
       |---------------------------------
              2       5       9      14

  2 x^3 + 3 x^2 + 4 x + 5
    = ( x - 1 )( 2 x^2 + 5 x + 9 ) + 14

 

또는

 

컴파일> go build testSyntheticDivision.go

실행> ./testSyntheticDivision 1 2 3 4 5
The coefficients of the quotient are 2, 5, 9
and the remainder is 14.

       |      2       3       4       5
     1 |              2       5       9
       |---------------------------------
              2       5       9      14

  2 x^3 + 3 x^2 + 4 x + 5
    = ( x - 1 )( 2 x^2 + 5 x + 9 ) + 14



 

Posted by Scripter
,

다음은 C 언어로 작성된 소스파일 testForFor.c(참조: 80컬럼 컨솔에 19단표 출력하기 예제 for C and Ch)를 Go 언어용으로 고친 것이다.
(* 한글이 있는 Go 소스파일은 UTF8 인코딩으로 저장해야 한다.)

 

  1. /*
  2.  *  Filename: testForFor.go
  3.  *
  4.  *  Compile:  go build  testForFor.go
  5.  *  Execute:  testForFor
  6.  *
  7.  *  Execute without compiling:  go run  testForFor.go
  8.  *
  9.  *  Date:  2012. 6. 16.
  10.  */
  11. package main
  12. import (
  13.     "fmt"
  14. )
  15. // dan으로 전달된 (구구단의) 한 단의 출력할 내용을
  16. // 스트링으로 만들어 반환하는 함수
  17. func getDan(dan int32) [19]string {
  18.     var sa string
  19.     var sb string
  20.     var sval string
  21.     var j int32
  22.     var t [19] string;
  23.     for j = 0; j < 19; j++ {
  24.         sa = fmt.Sprintf("%d", dan);
  25.         if len(sa) < 2 {
  26.             sa = fmt.Sprintf(" %d", dan);
  27.         }
  28.         sb = fmt.Sprintf("%d", j + 1);
  29.         if len(sb) < 2 {
  30.             sb = fmt.Sprintf(" %d", j + 1);
  31.         }
  32.         sval = fmt.Sprintf("%d", dan*(j + 1));
  33.         if len(sval) < 2 {
  34.             sval = fmt.Sprintf("  %d", dan*(j + 1));
  35.         } else if len(sval) < 3  {
  36.             sval = fmt.Sprintf(" %d", dan*(j + 1));
  37.         }
  38.         t[j] =  sa + " x " + sb + " = " + sval
  39.     }
  40.     return t
  41. }
  42. // 19단표를 모두 80컬럼 컨솔에 출력한다.
  43. func printAllNineteenDan() {
  44.     var d [] int32 = [] int32 {  2, 7, 11, 16 };      // 각 줄단위 블럭의 첫단
  45.     var counter [] int32 = [] int32 { 5, 4, 5, 4 };  // 각 줄단위 블럭에 속한 단의 개수
  46.     var lines[19] string;
  47.     var v [19]string;
  48.     var i int32
  49.     var j int32
  50.     var k int32
  51.     var arr [18][19]string;
  52.     for i = 2; i < 20; i++ {
  53.         v = getDan(i)
  54.         for j = 0; j < 19; j++ {
  55.             arr[i - 2][j] = v[j]
  56.         }
  57.     } 
  58.     for k = 0; k < 4; k++ {
  59.         // 80 바이트 길이의 한 줄씩 완성
  60.         for i = 0; i < 19; i++ {
  61.             lines[i] = arr[d[k]-2][i]
  62.             for j = 1; j < counter[k]; j++ {
  63.                 lines[i] += "   " + arr[d[k]-2+j][i]
  64.             }
  65.         }
  66.         // 80 바이트 길이의 한 줄씩 출력
  67.         for i = 0; i < 19; i++ {
  68.             fmt.Printf("%s\n", lines[i]);
  69.         }
  70.         fmt.Printf("\n");
  71.     }
  72.     fmt.Printf("\n");
  73. }
  74. // Go 언어의 main 함수 : 실행 시작 지점
  75. func main() {
  76.     printAllNineteenDan();    // 객체에 속하는 메소드 printDan()을 호출한다.
  77. }

 


실행> go run testForFor.go 
 
또는

컴파일> go build testForFor.go
실행> ./testForFor

 2 x  1 =   2    3 x  1 =   3    4 x  1 =   4    5 x  1 =   5    6 x  1 =   6
 2 x  2 =   4    3 x  2 =   6    4 x  2 =   8    5 x  2 =  10    6 x  2 =  12
 2 x  3 =   6    3 x  3 =   9    4 x  3 =  12    5 x  3 =  15    6 x  3 =  18
 2 x  4 =   8    3 x  4 =  12    4 x  4 =  16    5 x  4 =  20    6 x  4 =  24
 2 x  5 =  10    3 x  5 =  15    4 x  5 =  20    5 x  5 =  25    6 x  5 =  30
 2 x  6 =  12    3 x  6 =  18    4 x  6 =  24    5 x  6 =  30    6 x  6 =  36
 2 x  7 =  14    3 x  7 =  21    4 x  7 =  28    5 x  7 =  35    6 x  7 =  42
 2 x  8 =  16    3 x  8 =  24    4 x  8 =  32    5 x  8 =  40    6 x  8 =  48
 2 x  9 =  18    3 x  9 =  27    4 x  9 =  36    5 x  9 =  45    6 x  9 =  54
 2 x 10 =  20    3 x 10 =  30    4 x 10 =  40    5 x 10 =  50    6 x 10 =  60
 2 x 11 =  22    3 x 11 =  33    4 x 11 =  44    5 x 11 =  55    6 x 11 =  66
 2 x 12 =  24    3 x 12 =  36    4 x 12 =  48    5 x 12 =  60    6 x 12 =  72
 2 x 13 =  26    3 x 13 =  39    4 x 13 =  52    5 x 13 =  65    6 x 13 =  78
 2 x 14 =  28    3 x 14 =  42    4 x 14 =  56    5 x 14 =  70    6 x 14 =  84
 2 x 15 =  30    3 x 15 =  45    4 x 15 =  60    5 x 15 =  75    6 x 15 =  90
 2 x 16 =  32    3 x 16 =  48    4 x 16 =  64    5 x 16 =  80    6 x 16 =  96
 2 x 17 =  34    3 x 17 =  51    4 x 17 =  68    5 x 17 =  85    6 x 17 = 102
 2 x 18 =  36    3 x 18 =  54    4 x 18 =  72    5 x 18 =  90    6 x 18 = 108
 2 x 19 =  38    3 x 19 =  57    4 x 19 =  76    5 x 19 =  95    6 x 19 = 114

 7 x  1 =   7    8 x  1 =   8    9 x  1 =   9   10 x  1 =  10
 7 x  2 =  14    8 x  2 =  16    9 x  2 =  18   10 x  2 =  20
 7 x  3 =  21    8 x  3 =  24    9 x  3 =  27   10 x  3 =  30
 7 x  4 =  28    8 x  4 =  32    9 x  4 =  36   10 x  4 =  40
 7 x  5 =  35    8 x  5 =  40    9 x  5 =  45   10 x  5 =  50
 7 x  6 =  42    8 x  6 =  48    9 x  6 =  54   10 x  6 =  60
 7 x  7 =  49    8 x  7 =  56    9 x  7 =  63   10 x  7 =  70
 7 x  8 =  56    8 x  8 =  64    9 x  8 =  72   10 x  8 =  80
 7 x  9 =  63    8 x  9 =  72    9 x  9 =  81   10 x  9 =  90
 7 x 10 =  70    8 x 10 =  80    9 x 10 =  90   10 x 10 = 100
 7 x 11 =  77    8 x 11 =  88    9 x 11 =  99   10 x 11 = 110
 7 x 12 =  84    8 x 12 =  96    9 x 12 = 108   10 x 12 = 120
 7 x 13 =  91    8 x 13 = 104    9 x 13 = 117   10 x 13 = 130
 7 x 14 =  98    8 x 14 = 112    9 x 14 = 126   10 x 14 = 140
 7 x 15 = 105    8 x 15 = 120    9 x 15 = 135   10 x 15 = 150
 7 x 16 = 112    8 x 16 = 128    9 x 16 = 144   10 x 16 = 160
 7 x 17 = 119    8 x 17 = 136    9 x 17 = 153   10 x 17 = 170
 7 x 18 = 126    8 x 18 = 144    9 x 18 = 162   10 x 18 = 180
 7 x 19 = 133    8 x 19 = 152    9 x 19 = 171   10 x 19 = 190

11 x  1 =  11   12 x  1 =  12   13 x  1 =  13   14 x  1 =  14   15 x  1 =  15
11 x  2 =  22   12 x  2 =  24   13 x  2 =  26   14 x  2 =  28   15 x  2 =  30
11 x  3 =  33   12 x  3 =  36   13 x  3 =  39   14 x  3 =  42   15 x  3 =  45
11 x  4 =  44   12 x  4 =  48   13 x  4 =  52   14 x  4 =  56   15 x  4 =  60
11 x  5 =  55   12 x  5 =  60   13 x  5 =  65   14 x  5 =  70   15 x  5 =  75
11 x  6 =  66   12 x  6 =  72   13 x  6 =  78   14 x  6 =  84   15 x  6 =  90
11 x  7 =  77   12 x  7 =  84   13 x  7 =  91   14 x  7 =  98   15 x  7 = 105
11 x  8 =  88   12 x  8 =  96   13 x  8 = 104   14 x  8 = 112   15 x  8 = 120
11 x  9 =  99   12 x  9 = 108   13 x  9 = 117   14 x  9 = 126   15 x  9 = 135
11 x 10 = 110   12 x 10 = 120   13 x 10 = 130   14 x 10 = 140   15 x 10 = 150
11 x 11 = 121   12 x 11 = 132   13 x 11 = 143   14 x 11 = 154   15 x 11 = 165
11 x 12 = 132   12 x 12 = 144   13 x 12 = 156   14 x 12 = 168   15 x 12 = 180
11 x 13 = 143   12 x 13 = 156   13 x 13 = 169   14 x 13 = 182   15 x 13 = 195
11 x 14 = 154   12 x 14 = 168   13 x 14 = 182   14 x 14 = 196   15 x 14 = 210
11 x 15 = 165   12 x 15 = 180   13 x 15 = 195   14 x 15 = 210   15 x 15 = 225
11 x 16 = 176   12 x 16 = 192   13 x 16 = 208   14 x 16 = 224   15 x 16 = 240
11 x 17 = 187   12 x 17 = 204   13 x 17 = 221   14 x 17 = 238   15 x 17 = 255
11 x 18 = 198   12 x 18 = 216   13 x 18 = 234   14 x 18 = 252   15 x 18 = 270
11 x 19 = 209   12 x 19 = 228   13 x 19 = 247   14 x 19 = 266   15 x 19 = 285

16 x  1 =  16   17 x  1 =  17   18 x  1 =  18   19 x  1 =  19
16 x  2 =  32   17 x  2 =  34   18 x  2 =  36   19 x  2 =  38
16 x  3 =  48   17 x  3 =  51   18 x  3 =  54   19 x  3 =  57
16 x  4 =  64   17 x  4 =  68   18 x  4 =  72   19 x  4 =  76
16 x  5 =  80   17 x  5 =  85   18 x  5 =  90   19 x  5 =  95
16 x  6 =  96   17 x  6 = 102   18 x  6 = 108   19 x  6 = 114
16 x  7 = 112   17 x  7 = 119   18 x  7 = 126   19 x  7 = 133
16 x  8 = 128   17 x  8 = 136   18 x  8 = 144   19 x  8 = 152
16 x  9 = 144   17 x  9 = 153   18 x  9 = 162   19 x  9 = 171
16 x 10 = 160   17 x 10 = 170   18 x 10 = 180   19 x 10 = 190
16 x 11 = 176   17 x 11 = 187   18 x 11 = 198   19 x 11 = 209
16 x 12 = 192   17 x 12 = 204   18 x 12 = 216   19 x 12 = 228
16 x 13 = 208   17 x 13 = 221   18 x 13 = 234   19 x 13 = 247
16 x 14 = 224   17 x 14 = 238   18 x 14 = 252   19 x 14 = 266
16 x 15 = 240   17 x 15 = 255   18 x 15 = 270   19 x 15 = 285
16 x 16 = 256   17 x 16 = 272   18 x 16 = 288   19 x 16 = 304
16 x 17 = 272   17 x 17 = 289   18 x 17 = 306   19 x 17 = 323
16 x 18 = 288   17 x 18 = 306   18 x 18 = 324   19 x 18 = 342
16 x 19 = 304   17 x 19 = 323   18 x 19 = 342   19 x 19 = 361



 

Posted by Scripter
,