汉明距离

package main

import (
	"fmt"
	"strconv"
)

func main() {

	/*
	两个整数之间的汉明距离指的是这两个数字对应二进制位不同的位置的数目。
	给出两个整数 x 和 y,计算它们之间的汉明距离。

	输入: x = 1, y = 4
	输出: 2
	解释:
	1   (0 0 0 1)
	4   (0 1 0 0)
		   ↑   ↑
	*/

	//计算二进制
	var x, y int
	fmt.Println("计算汉明距离")
	fmt.Println("请输入两个数字,按照空格分离")
	fmt.Scanln(&x, &y)
	x_bin := convertToBin(x)
	fmt.Println( x_bin)
	y_bin := convertToBin(y)
	fmt.Println(y_bin)

	//补充零
	if len(x_bin) > len(y_bin) {
		//添加零
		n := len(x_bin) - len(y_bin)
		var lin string
		for i := 0; i < n; i++ {
			lin += "0"
		}
		y_bin = lin + y_bin
		fmt.Println(y_bin)

	} else {
		//添加零
		n := len(y_bin) - len(x_bin)
		var lin string
		for i := 0; i < n; i++ {
			lin += "0"
		}
		x_bin = lin + x_bin
		fmt.Println(x_bin)
	}

	flag := 0
	for i := 0; i < len(x_bin); i++ {
		if x_bin[i] != y_bin[i] {
			flag += 1
		}
	}
	fmt.Println("汉明距离为:", flag)

}

// 将十进制数字转化为二进制字符串
func convertToBin(num int) string {
	s := ""

	if num == 0 {
		return "0"
	}

	// num /= 2 每次循环的时候 都将num除以2  再把结果赋值给 num
	for ; num > 0; num /= 2 {
		lsb := num % 2
		// strconv.Itoa() 将数字强制性转化为字符串
		s = strconv.Itoa(lsb) + s
	}
	return s
}

/*
计算汉明距离
请输入两个数字,按照空格分离
212 2312
11010100
100100001000
000011010100
汉明距离为: 7
*/

  

原文地址:https://www.cnblogs.com/yzg-14/p/12370233.html