Golang语法的25个练习题:1至5题
题目1:水仙花数
水仙花数(Narcissistic number)也被称为超完全数字不变数(pluperfect digital invariant, PPDI)、自恋数、自幂数、阿姆斯壮数或阿姆斯特朗数(Armstrong number),水仙花数是指一个 3 位数,它的每个位上的数字的 3次幂之和等于它本身。例如:1^3 + 5^3+ 3^3 = 153。
package main
import (
"fmt"
"math"
)
func main() {
// 写法一
for i := 100; i < 1000; i++ {
// 取百位数字 123//100=1
// 取十位数字 123//10=12 12%10=2
// 取个位数字 123%10=3
i1, i2, i3 := i/100, i/10%10, i%10
if int(math.Pow(float64(i1), 3)+math.Pow(float64(i2), 3)+math.Pow(float64(i3), 3)) == i {
fmt.Printf("%d是水仙花数\n", i)
// 153 是水仙花数
// 370 是水仙花数
// 371 是水仙花数
// 407 是水仙花数
}
}
// 写法二
for i := 1000; i < 10000; i++ {
sum := 0
for k := i; k > 0; k = k / 10 {
// 个十百
sum += int(math.Pow(float64(k%10), 3))
}
if sum == i {
fmt.Printf("%d是四叶玫瑰数\n", i)
}
}
}
题目2:四叶玫瑰数
四叶玫瑰数是4位数的自幂数。自幂数是指一个 n 位数,它的每个位上的数字的 n 次幂之和等于它本身。(例如:当n为3时,有1^3 + 5^3 + 3^3 = 153,153即是n为3时的一个自幂数,3位数的自幂数被称为水仙花数)。
package main
import (
"fmt"
"math"
)
func main() {
// 写法一
for i := 1000; i < 10000; i++ {
// 取千位数字 1234//1000=1
// 取百位数字 1234//100=12 12%10=2
// 取十位数字 1234//10=123 123%10=3
// 取个位数字 1234%10=4
i1, i2, i3, i4 := i/1000, i/100%10, i/10%10, i%10
if int(math.Pow(float64(i1), 4)+math.Pow(float64(i2), 4)+math.Pow(float64(i3), 4)+math.Pow(float64(i4), 4)) == i {
fmt.Printf("%d是四叶玫瑰数\n", i)
// 1634 是四叶玫瑰数
// 8208 是四叶玫瑰数
// 9474 是四叶玫瑰数
}
}
// 写法二
for i := 1000; i < 10000; i++ {
sum := 0
for k := i; k > 0; k = k / 10 {
// 个十百千
sum += int(math.Pow(float64(k%10), 4))
}
if sum == i {
fmt.Printf("%d是四叶玫瑰数\n", i)
}
}
}
题目3:逆序输出字符串
package main
import (
"fmt"
"log"
"os"
)
func main() {
fmt.Print("请输入字符串:")
read := make([]byte, 1024)
n, err := os.Stdin.Read(read) // 从标准输入流读取数据
if err != nil {
log.Fatalln(err)
}
for i, j := 0, n-1; i < j; i, j = i+1, j-1 {
read[i], read[j] = read[j], read[i]
}
fmt.Println(string(read[:n]))
}
题目4:猜数字小游戏
需求分析:
- 随机生成一个100以内的整数,共有10次机会
- 开始游戏,输入猜测的数字
- 如果猜小了,提示猜小了
- 如果猜大了,提示猜大了
- 猜对了,提示猜对了,并且结束游戏
- 10次机会用完还没猜对,提示游戏结束,没有猜到。
package main
import (
"fmt"
"log"
"math/rand"
"os""strconv"
"time"
)
func main() {
rd := rand.New(rand.NewSource(time.Now().UnixNano()))
number := rd.Intn(100)
for i := 0; i < 10; i++ {
fmt.Print("请输入你要猜测的数字:")
read := make([]byte, 100)
n, err := os.Stdin.Read(read)
if err != nil {
log.Fatalln(err)
}
choice, err := strconv.Atoi(string(read[:n-1])) // n-1 是去除最后的回车(换行符)
if err != nil {
fmt.Println("输入的不是数字")
continue
}
if choice > number {
fmt.Println("你猜大了")
} else if choice < number {
fmt.Println("你猜小了")
} else {
fmt.Println("你猜对了,真棒!")
fmt.Printf("你一共用了%d次机会\n", i+1)
return
}
fmt.Printf("还剩%d次机会\n", 9-i)
}
fmt.Println("游戏结束,你没有猜到")
}
题目5:百鸡百钱
需求分析:
- 公鸡每只5元,母鸡每只3元,小鸡3只一元,现要求用100元钱买100只鸡(三种类型的鸡都要买),问公鸡、母鸡、小鸡各买几只?
- 数学:
- 设公鸡买了x只,母鸡买了y只,小鸡买了z只
- x+y+z= 100
- 5x+3y+z/3 = 100
算法思路
- 以公鸡为突破点,公鸡5元一只,100元最多只能买20只,
- 由于三种鸡都要买,所以公鸡数一定是小于20的。
- 母鸡每只3元,100全拿来买母鸡,最多也不能超过33只
- 设公鸡数为x,母鸡数为y,小鸡z只
- 只要满足5x+3y+z/3=100 和 x+y+z==100 就可以输出此种组合的结果.
package main
import (
"fmt"
"strings"
)
func main() {
count := 0
for x := 1; x < 20; x++ {
for y := 1; y < 33; y++ {
z := 100 - x - y
if z > 0 && z%3 == 0 && 5*x+3*y+z/3 == 100 {
count++
fmt.Println(strings.Repeat("=", 60))
fmt.Printf("第%d种买法,公鸡买了%d只,母鸡买了%d只,小鸡买了%d只\n", count, x, y, z)
}
}
}
}
python原文:https://www.52pojie.cn/thread-1689186-1-1.html