Go實現進制間相互轉換

//Golang 練習題
package main

import (
	"fmt"
	"log"
	"math"
	"strconv"
	"strings"
)

var g_dayRemain int = 97

func countDay(day_remain int) (int, int) {
	week_prec := 7
	var week int = day_remain / week_prec
	var day int = day_remain % week_prec
	return week, day
}

//轉換公式5/9*(華氏溫度-100)
func temperatureConvert(fahrenheit float32) float32 {
	return (5.0 / 9 * (fahrenheit - 100))
}

//交換兩個變量
func swap(a, b int) (int, int) {
	a = a + b
	b = a - b
	a = a - b
	return a, b
	//return b,a //一句話就可以實現a,b交換
}

//進制間的輸出
func scale() {
	var num int = 5
	var num1 int = 80
	var num2 int = 011 //八進制0打頭
	var num3 int = 0x11

	fmt.Printf("num 二進制是%b\n", num)
	fmt.Printf("num1 八進制是%o\n", num1) //輸出120 1*8^2+2*8^1+0*8^0
	fmt.Printf("num1 十六進制是%#x\n", num1)

	fmt.Println("num2=", num2)
	fmt.Println("num3=", num3)

}

// 十進制轉二進制
func DecBin(n int64) string {
	if n < 0 {
		log.Println("Decimal to binary error: the argument must be greater than zero.")
		return ""
	}
	if n == 0 {
		return "0"
	}
	s := ""
	for q := n; q > 0; q = q / 2 {
		m := q % 2
		s = fmt.Sprintf("%v%v", m, s)
	}
	return s
}

// Decimal to octal
func DecOct(d int64) int64 {
	if d == 0 {
		return 0
	}
	if d < 0 {
		log.Println("Decimal to octal error: the argument must be greater than zero.")
		return -1
	}
	s := ""
	for q := d; q > 0; q = q / 8 {
		m := q % 8
		s = fmt.Sprintf("%v%v", m, s)
	}
	n, err := strconv.Atoi(s)
	if err != nil {
		log.Println("Decimal to octal error:", err.Error())
		return -1
	}
	return int64(n)
}

// Decimal to hexadecimal
func DecHex(n int64) string {
	if n < 0 {
		log.Println("Decimal to hexadecimal error: the argument must be greater than zero.")
		return ""
	}
	if n == 0 {
		return "0"
	}
	hex := map[int64]int64{10: 65, 11: 66, 12: 67, 13: 68, 14: 69, 15: 70}
	s := ""
	for q := n; q > 0; q = q / 16 {
		m := q % 16
		if m > 9 && m < 16 {
			m = hex[m]
			s = fmt.Sprintf("%v%v", string(m), s)
			continue
		}
		s = fmt.Sprintf("%v%v", m, s)
	}
	return s
}

// Binary to decimal
func BinDec(b string) (n int64) {
	s := strings.Split(b, "")
	l := len(s)
	i := 0
	d := float64(0)
	for i = 0; i < l; i++ {
		f, err := strconv.ParseFloat(s[i], 10)
		if err != nil {
			log.Println("Binary to decimal error:", err.Error())
			return -1
		}
		d += f * math.Pow(2, float64(l-i-1))
	}
	return int64(d)
}

// Octal to decimal
func OctDec(o int64) (n int64) {
	s := strings.Split(strconv.Itoa(int(o)), "")
	l := len(s)
	i := 0
	d := float64(0)
	for i = 0; i < l; i++ {
		f, err := strconv.ParseFloat(s[i], 10)
		if err != nil {
			log.Println("Octal to decimal error:", err.Error())
			return -1
		}
		d += f * math.Pow(8, float64(l-i-1))
	}
	return int64(d)
}

// Hexadecimal to decimal
func HexDec(h string) (n int64) {
	s := strings.Split(strings.ToUpper(h), "")
	l := len(s)
	i := 0
	d := float64(0)
	hex := map[string]string{"A": "10", "B": "11", "C": "12", "D": "13", "E": "14", "F": "15"}
	for i = 0; i < l; i++ {
		c := s[i]
		if v, ok := hex[c]; ok {
			c = v
		}
		f, err := strconv.ParseFloat(c, 10)
		if err != nil {
			log.Println("Hexadecimal to decimal error:", err.Error())
			return -1
		}
		d += f * math.Pow(16, float64(l-i-1))
	}
	return int64(d)
}

// Octal to binary
func OctBin(o int64) string {
	d := OctDec(o)
	if d == -1 {
		return ""
	}
	return DecBin(d)
}

// Hexadecimal to binary
func HexBin(h string) string {
	d := HexDec(h)
	if d == -1 {
		return ""
	}
	return DecBin(d)
}

// Binary to octal
func BinOct(b string) int64 {
	d := BinDec(b)
	if d == -1 {
		return -1
	}
	return DecOct(d)
}

// Binary to hexadecimal
func BinHex(b string) string {
	d := BinDec(b)
	if d == -1 {
		return ""
	}
	return DecHex(d)
}

//用終端寫入數據
func FomatInOutput() {
	var name string
	var age byte
	var salary float32
	var isPass bool

	fmt.Println("請輸入姓名:")
	fmt.Scanln(&name)

	fmt.Println("請輸入年齡:")
	fmt.Scanln(&age)

	fmt.Println("請輸入薪水:")
	fmt.Scanln(&salary)

	fmt.Println("請輸入是否通過考試:")
	fmt.Scanln(&isPass)

	fmt.Printf("名字是%v\n年齡是%v\n薪水是%v\n是否通過考試%v", name, age, salary, isPass)

	fmt.Println("請輸入姓名 年齡 薪水 是否通過考試,中間用空格隔開")
	fmt.Scanf("%s %d %f %t", &name, &age, &salary, &isPass)
	fmt.Printf("名字是%v\n年齡是%v\n薪水是%v\n是否通過考試%v", name, age, salary, isPass)
}

func main() {

	var week_re int
	var day_re int
	var centigrade float32
	var fahrenheit float32 = 198.25
	week_re, day_re = countDay(g_dayRemain)
	fmt.Printf("再過%d個星期零%d天放假.\n", week_re, day_re)
	centigrade = temperatureConvert(fahrenheit)
	fmt.Printf("華氏溫度%v對應的攝氏溫度是%v.\n", fahrenheit, centigrade)

	var num1 int = 8
	var num2 int = 9
	fmt.Println("num1=", num1, "num2=", num2)
	num1, num2 = swap(num1, num2)
	fmt.Println("num1=", num1, "num2=", num2)

	//FomatInOutput()
	scale()

	//十進制轉二進制
	var binStr = DecBin(15)
	fmt.Println("binStr=", binStr)

	//十進制轉八進制
	var octInt = DecOct(15)
	fmt.Println("octInt=", octInt)

	//十進制轉十六進制
	var hexStr = DecHex(255)
	fmt.Println("hexStr=", hexStr)

	//二進制轉十進制
	var bin2Dec = BinDec("1101")
	fmt.Println("bin2Dec=", bin2Dec)

	//八進制轉十進制
	var oct2Dec = OctDec(120)
	fmt.Println("oct2Dec=", oct2Dec)

	//十六進制轉十進制
	var hex2Dec = HexDec("FF")
	fmt.Println("hex2Dec=", hex2Dec)

}

Code Run輸出:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章