GO作业:写的几个练习

有中文的字符串,一定得先转成rune型,再之后求字符串长度时,也应该是用runelen(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)
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值