受之前用C和C++刷题的影响,所有输入我都喜欢用scanf处理,恰恰golang也有scanf函数,所以说golang也可以像C和C++一样完美处理所有情景下的输入,可谓是一招鲜吃遍天!
1. fmt.Scanf
首先来介绍一下fmt包的Scanf函数。
这个函数的第一个参数是一个指定读入数据格式的字符串,用“%+一个小写字母”来指定读入的数据格式以及给数据占位,最常用的是用%d表示读入int类型数据,用%s读入字符串,用%c读入一个字符。从第二个参数开始就是读入数据后保存的变量,务必要用引用的方式,比如&num,变量数要与第一个参数字符串中的占位符%的数目保持一致。
Scanf函数的返回值有两个,第一个是读入的数据数目,一般在刷题时不会用到它,第二个返回值是err,这个err非常有用,可以帮助我们判断是否读完所有的输入。
一个Scanf函数的示例:
n,err:=fmt.Scanf("%d%d",&a,&b)
示例中,n就是读到的数据数目,为2,err就是返回的错误,“%d%d”表示读入两个int类型数据,按顺序保存到a、b变量中,注意a、b变量是引用的格式。
上图是C和C++中scanf格式符对应的数据类型,务必要注意,在Go语言中字符串也是要用引用的
2. 十个场景搞懂Golang在ACM模式下的输入
简单了解Scanf函数后我们就可以针对各种情况来处理输入了。
2.1 行数不固定,每行有固定数目的数据
输入描述:
输入包括两个正整数a,b(1 <= a, b <= 1000),输入数据包括多组。输出描述:
输出a+b的结果输入示例:
1 5
10 20输出示例:
6
30
该题目要求很简单,每行两个数据,但是行数不固定,我们需要自行判断是否读入完全部输入数据。其实判断是否读入完全部数据很简单,就是利用Scanf返回的err,当读入完全部数据后err!=nil。
仅供参考的AC代码如下:
package main
import (
"fmt"
)
func main(){
var a,b int
for {
_,err:=fmt.Scanf("%d%d",&a,&b);
if err!=nil{
return
}
fmt.Println(a+b)
}
}
2.2 第一行给定行数,第二行开始每行数据数目固定
输入描述:
输入第一行包括一个数据组数t (1 <= t <= 100)
接下来每行包括两个正整数a,b ( 1 <-a, b <= 1000)
输出描述:
输出a+b的结果
输入示例:
21 5
10 2