Go-经典编程题

1.排列组合

  • 题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?
  • 分析:三层嵌套循环,时间复杂度为O(n^3)
func main() {
	arr := []int{1, 2, 3, 4}
	for i := 0; i < len(arr); i++ {
		for j := 0; j < len(arr); j++ {
			for k := 0; k < len(arr); k++ {
				if arr[i] != arr[j] && arr[j] != arr[k] {
					fmt.Printf("%d%d%d\n", arr[i], arr[j], arr[k])
				}
			}
		}
	}
}

2.三元方程

  • 题目:一个整数(10万以内),它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?
  • 分析:将多元方程的数学求解方法转换为计算机程序, 即:
    设该数为x,加100后得到的完全平方数为y^2,再加168后得到的完全平方数为z^2
  • 参考:https://blog.csdn.net/baishuiniyaonulia/article/details/77922601
func main() {
	var x = -100  //x+100=y*y (可知:x>=-100);
	var y, z float64 = 0, 0
	for ; (z+y) >= 0 && (z+y) <= 168; x++ {
		y = math.Sqrt(float64(x + 100))
		z = math.Sqrt(float64(x + +100 + 168))
		// 判断y,z是整数
		if math.Ceil(y) == math.Floor(y) && math.Ceil(z) == math.Floor(z) {
			fmt.Println(x)
		}
	}
}

3.判断闰年

  • 题目:输入某年某月某日,判断这一天是这一年的第几天?
  • 分析:闰年:四年剔百一闰,或四百年一闰
func foo(year, month, day int) {
	year, month, day = 2018, 3, 1
	counts := []int{31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31} //平年

	var sum = day
	for i := 0; i < month-1; i++ {
		sum += counts[i]
	}

	if (year%4 == 0 && year%100 != 0) || (year%400 == 0) && month > 2 {
		sum += 1
	}
	fmt.Println(sum)
}

4.乘法口诀

  • 题目:输出九九乘法表
  • 分析:注意坐标系变换打印控制
func main() {
	for x := 1; x < 10; x++ {
		for y := 1; y < 10; y++ {
			if y<= x {
				fmt.Printf("%d*%d=%-3d", y, x, x*y)  //左对齐占3位
			}
		}
		fmt.Println()
	}
}

5.打印棋盘

  • 题目:要求输出国际象棋棋盘
  • 分析:定义黑白两个字符色块;根据奇偶控制输出
func main() {
	black := "\033[40;37m  \033[0m" //空格字符色块
	white := "\033[40;47m  \033[0m"

	for i := 0; i < 8; i++ {
		for j := 0; j < 8; j++ {
			if (i+j)%2 == 0 {
				fmt.Printf(white)
			} else {
				fmt.Printf(black)
			}
		}
		fmt.Println()
	}
}

6.打印楼梯

  • 分析:借鉴打印棋盘乘法口诀,控制输出条件
func main() {
	black := "\033[40;37m  \033[0m" 
	white := "\033[40;47m  \033[0m"

	for i := 0; i < 8; i++ {
		for j := 0; j < 8 && j < i; j++ {
			if (i+j)%2 == 0 {
				fmt.Printf(white)
			} else {
				fmt.Printf(black)
			}
		}
		fmt.Println()
	}
}

7.兔子问题

  • 题目:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
  • 分析:兔子问题即斐波那契序列问题,可循环或递归实现
// 循环方式
func main() {
	var f1, f2 int = 1, 1
	var i int
	for i = 1; i <= 10; i++ {
		fmt.Printf("%12d %12d", f1, f2)
		if i%2 == 0 {
			fmt.Printf("\n")
		}
		f1 = f1 + f2 /*前两个月加起来赋值给第三个月*/
		f2 = f1 + f2
	}
}
//递归方式
func Fibonacci(num int) int {
	if num < 3 {
		return 1
	}
	return Fibonacci(num-1) + Fibonacci(num-2)
}

8. 素数个数

  • 题目: 判断101-200之间有多少个素数,并输出所有素数。
  • 分析:如果概数能被2 ~ sqrt(n)中的某个数,则此数不是素数,反之是素数。
  • 注意边界取值
func main() {
	for i, n := 100, 0; i < 200; i++ {
		sqt :=int( math.Sqrt(float64(i+1))) 
		for j := 2; j <=sqt; j++ {
			if i%j == 0 {
				goto NEXT
			}
		}
		fmt.Printf("%-4d", i)
		n++
		if n%10 == 0 {
			fmt.Println()
		}
	NEXT:
	}
} 

9. 水仙花数

  • 题目:打印出所有的“水仙花数”(指一个三位数,其各位数字立方和等于该数本身),例如:153=1^3+5^3+3^3
  • 分析:利用for循环控制100-999个数,每个数分解出个位,十位,百位。
func main() {
	for n := 100; n < 1000; n++ {
		i := n / 100
		j := (n % 100) / 10
		k := (n % 100) % 10
		if i*100+j*10+k == i*i*i+j*j*j+k*k*k {
			fmt.Printf("%-4d", n)
		}
	}
}

10.数学求解

  • 题目:一球从100米高度落下,每次落地后反跳回原高度的一半;再落下,求第10次落地时,共经过多少米?第10次反弹多高?
  • 分析:定位变量和变量关系循环10次,变量为sum和mid,结果累加
func main() {
	var sum, mid float64 = 100, 50
	for n := 2; n <= 10; n++ {
		sum += mid * 2  //反跳高度
		mid /= 2
	}
	fmt.Println(sum, mid)
}

参考:
https://www.zybuluo.com/Gestapo/note/32082#golang%E7%BC%96%E7%A8%8B%E7%99%BE%E4%BE%8B

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值