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