道者编程

go基础知识(三)基础实例

一:打印乘法口诀表

package main
import "fmt"

func main() {
	for i :=1; i <= 9; i++ { //外层循环9次
		for j :=1; j <=i; j++ { //内层循环到外层的当前值
			fmt.Printf("%d × %d = %d  ",j,i,(i*j))
		}
		fmt.Println("") //换行
	}
}
 执行结果:
1 × 1 = 1
1 × 2 = 2  2 × 2 = 4
1 × 3 = 3  2 × 3 = 6  3 × 3 = 9
1 × 4 = 4  2 × 4 = 8  3 × 4 = 12  4 × 4 = 16
1 × 5 = 5  2 × 5 = 10  3 × 5 = 15  4 × 5 = 20  5 × 5 = 25
1 × 6 = 6  2 × 6 = 12  3 × 6 = 18  4 × 6 = 24  5 × 6 = 30  6 × 6 = 36
1 × 7 = 7  2 × 7 = 14  3 × 7 = 21  4 × 7 = 28  5 × 7 = 35  6 × 7 = 42  7 × 7 = 49
1 × 8 = 8  2 × 8 = 16  3 × 8 = 24  4 × 8 = 32  5 × 8 = 40  6 × 8 = 48  7 × 8 = 56  8 × 8 = 64
1 × 9 = 9  2 × 9 = 18  3 × 9 = 27  4 × 9 = 36  5 × 9 = 45  6 × 9 = 54  7 × 9 = 63  8 × 9 = 72  9 × 9 = 81

二:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?

package main
import "fmt"

func main() {
	nums := [...]int{1,2,3,4} //数组
	var count int = 0
	//三位组合对比
	for _, i := range nums {
		for _, j := range nums {
			for _, k := range nums {
				if i != j && i != k && k != j{
					fmt.Printf("%d%d%d;",i,j,k) //打印不重复的组合数
					count++ //总数
				}
			}
		}
	}
	fmt.Println("\n 一共有 ",count,"个不重复的组合")
}
 执行结果:

123;124;132;134;142;143;213;214;231;234;241;243;312;314;321;324;341;342;412;413;421;423;431;432;
 一共有  24 个不重复的组合

三:冒泡法:

package main
import "fmt"

func main() {
	var nums = []int{20,1,3,2,5,4,7,9,8,6,21,100} 
	var listStr = sort(nums)
	for _, key := range listStr{
		fmt.Println(key)
	}
}
//排序从大到小
func sort(data []int) []int{
	count := len(data) //数组长度
	//外层循环数组
	for i := 1; i <= count; i++ {
		//内层对比循环,把最大或者最小数沉入最后
		for j :=0; j < count-i; j++ {
			if data[j] < data[j+1] {
				tmp := data[j]
				data[j] = data[j+1]
				data[j+1] = tmp
			}	
		}
	}
	return data
}

指针实现:

package main
import "fmt"

func main() {
	var nums = []int{20,1,3,2,5,4,7,9,8,6,21,100} 
	var listStr = sort(&nums) //地址传递
	for _, key := range listStr{
		fmt.Println(key)
	}
}
//排序从大到小
func sort(data *[]int) []int{
	count := len(*data) //数组长度
	//外层循环数组
	for i := 1; i <= count; i++ {
		//内层对比循环,把最大或者最小数沉入最后
		for j :=0; j < count-i; j++ {
			if (*data)[j] < (*data)[j+1] {
				tmp := (*data)[j]
				(*data)[j] = (*data)[j+1]
				(*data)[j+1] = tmp
			}	
		}
	}
	return *data
}

四:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少

package main
import (
	"fmt"
	"math" //数学函数包
	"strconv" //转换类型
)

func main() {
	for i :=1; i<=10000; i++ {
		a100 := mySqrt(i+100)
		b100 := strConv(a100)

		a268 := mySqrt(i+268)
		b268 := strConv(a268)

		if(a100-b100 == 0 ) && (a268-b268 == 0 ){
			fmt.Println(i)
		}
	}
}

//求平方根
func mySqrt(x int) float64 {
    fStr := float64(x)
    return math.Sqrt(fStr)
}

//float64 转 字符串取小数点2位,再转float64
func strConv(x float64) float64{
	str := fmt.Sprintf("%.2f",x)
	strData,_ := strconv.ParseFloat(str,64)
	return strData
}

执行结果:

21
261
1581

五:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?这段话看不明白,其实就是斐波那契数列:第1列和第2列都是1,从第3列开始,每1列的值为前面两列之和。我们用go 取一下第N列

递归:

package main
import (
	"fmt"
)

func main() {
	a := fbnq(10) //取N列 
	fmt.Println(a) //第10列是55
}

//递归
func fbnq(x int) int {
	if(x == 1 || x == 2){
		return 1
	}
	return fbnq(x-1)+fbnq(x-2)
}

 递推互换:

package main
import (
	"fmt"
)
//斐波那契取N列
func main() {
	a := fbnq(10) //取第10列
	fmt.Println(a)
}

//递推互换
func fbnq(x int) int {
	//第1第2列都为1
	if(x == 1 || x == 2){
		return 1
	}
	t1 := 1 //初始第1列
	t2 := 1 //初始第2列
	/*
	第4列开始执行
	第3列for不满足,跳过for直接执行底下的 return t1+t2
	*/
	for i :=3; i < x; i++{ 
		tmp := t1+t2 //tmp第一次为2,循环中往后面带
		t1 = t2
		t2 = tmp
	}
	return t1+t2
}

六:打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个“水仙花数”,因为153=1的三次方+5的三次方+3的三次方。

package main
import (
	"fmt"
)
/*
//水仙花数:3位数,各位数字立方和等于该数本身
首先要取位数
个位:取模 i%10
十位:整除再取模 i/10%10
百位:整除再取模 i/100%10
N 位:i/N%10
*/
func main() {
	for i := 100; i<=999; i++ {
		gewei := power(i%10)
		shiwei := power(i/10%10)
		baiwei := power(i/100%10)

		if (gewei+shiwei+baiwei) == i {
			fmt.Println(i)
		}

	}
}

func power(x int)int{
	str := x * x * x 
	return str
}
执行结果:

153
370
371
407


最新评论:
我要评论:

看不清楚