有中文的字符串,一定得先转成rune
型,再之后求字符串长度时,也应该是用rune
的len(converted_str)
,如果用len(str)
,这个长度是指ASCII的8位截下来的长度。本代码放在一个文件中,可以直接编译通过。
// Copyright 2020 David Chang. All rights reserved.
// 该练习完成这么几件事:
/* 打印九九乘法表
查找1到1000之间的完数
输入一串字符,统计其中的字母、空格、数字和其它等字符数量
检查是否是回文
*/
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
func ptr1(a, b int) {
fmt.Print(a, " x ", b, " = ", a*b)
}
func isComplete(a int) (bool, string) {
var sum = 0
var tmpstr string
for i := 1; i <= a/2; i++ {
if a%i == 0 {
sum += i
tmpstr += strconv.Itoa(i) + " + "
}
}
return sum == a, strings.TrimSuffix(tmpstr, " + ")
}
func reverse(str string) string { //反转字符串用
tmp := []rune(str) //如果下面的循环用len(str),输入中文不行
for i, j := 0, len(tmp)-1; i < j; i, j = i+1, j-1 {
tmp[i], tmp[j] = tmp[j], tmp[i]
}
return string(tmp)
}
func calnum(str string) (zm int, kg int, sz int, qt int) {
tmp1 := []rune(str) //考虑到中文,一定得先转为rune型
for i := 0; i < len(tmp1); i++ {
switch {
case tmp1[i] == 32:
kg++
case tmp1[i] >= 65 && tmp1[i] <= 90 || tmp1[i] >= 97 && tmp1[i] <= 122:
zm++
case tmp1[i] >= 48 && tmp1[i] <= 57:
sz++
default:
qt++
}
}
return zm, kg, sz, qt
}
func main() {
fmt.Println("打印九九乘法表:")
for i := 1; i <= 9; i++ {
for j := 1; j <= i; j++ {
ptr1(i, j)
if j != i {
fmt.Print(", ")
} else {
fmt.Print("\n")
}
}
}
fmt.Println("查找1到1000之间的完数,就是该数等于它所有因数的和:")
for i := 1; i <= 1000; i++ {
result, forPrint := isComplete(i)
if result {
fmt.Printf("%d = %s 是一个完数\n", i, forPrint)
}
}
fmt.Println("从命令行随便输入一串字符,统计出这串字符器中有多少字母、空格、数字和其它等字符,并检查是否是回文:")
input, _ := bufio.NewReader(os.Stdin).ReadString('\n')
input = strings.TrimSuffix(input, "\n")
if reverse(input) == input {
fmt.Printf("你输入的是一串回文:\n\"%s\"\n", input)
} else {
fmt.Printf("你输入的字符串原来是:\n\"%s\"\n反过来是:\n\"%s\"\n它不是一串回文\n", input, reverse(input))
}
zm, kg, sz, qt := calnum(input)
fmt.Printf("你输入的字母有%d个,空格有%d个,数字有%d个,以及其它字符%d个\n", zm, kg, sz, qt)
}