【Go】用 Golong 处理 ACM 模式下的输入输出


一、用 fmt 包实现简单读取数字

1. 每行数字数量固定

不知道行数

输入描述:
输入包括两个正整数 a,b(1 <= a, b <= 1000),输入数据包括多组。

输出描述:
输出a+b的结果

输入例子1:
1 5
10 20

输出例子1:
6
30

代码:使用 fmt.Scanln 或 fmt.Scan

package main

import (
	"fmt"
)

func main() {
	a := 0
	b := 0
	for {
		n, _ := fmt.Scanln(&a, &b)  //也可以用 fmt.Scan
		if n == 0 {
			break
		} else {
			fmt.Printf("%d\n", a+b)
		}
	}
}

知道行数

输入描述:
输入第一行包括一个数据组数t(1 <= t <= 100)
接下来每行包括两个正整数a,b(1 <= a, b <= 1000)

输出描述:
输出a+b的结果

输入例子1:
2
1 5
10 20

输出例子1:
6
30

代码:

package main

import(
    "fmt"
)

func main(){
    var t,a,b int
    fmt.Scanln(&t)
    for i:=0;i<t;i++{
        fmt.Scanln(&a,&b)
        fmt.Println(a+b)
    }
}

2. 每行数字数量不固定,但知道数量

不知道行数

(1)有结束标志
输入描述:
输入数据包括多组。
每组数据一行,每行的第一个整数为整数的个数n(1 <= n <= 100), n为0的时候结束输入。
接下来n个正整数,即需要求和的每个正整数。

输出描述:
每组数据输出求和的结果

输入例子1:
4 1 2 3 4
5 1 2 3 4 5
0

输出例子1:
10
15

代码1:

package main

import (
	"fmt"
)

func main() {
	var t int
	for {
        var sum int
        
		fmt.Scan(&t)
		if t == 0 {
			break
		} else {
			a := make([]int, t)
			for i := 0; i < t; i++ {
				fmt.Scan(&a[i])
			}
			for i := 0; i < t; i++ {
				sum += a[i]
			}
		}
		fmt.Println(sum)
	}
}

代码2:

package main

import(
    "fmt"
)

func main(){
    var t, crr, sum int
    for{
        fmt.Scan(&t)
        sum = 0
        if t==0{
            break
        }else{
            for i:=0;i<t;i++{
                fmt.Scan(&crr)
                sum += crr
            }
            fmt.Println(sum)
        }
    }

}
(2)无结束标志(没得读了就结束)
输入描述:
输入数据有多组, 每行表示一组输入数据。
每行的第一个整数为整数的个数n(1 <= n <= 100)。
接下来n个正整数, 即需要求和的每个正整数。

输出描述:
每组数据输出求和的结果

输入例子1:
4 1 2 3 4
5 1 2 3 4 5

输出例子1:
10
15

代码1:

package main

import (
	"fmt"
)

func main() {
	var t int
	for {
        var sum int
        n,_ := fmt.Scan(&t)
		if n == 0 {
			break
		} else {
			a := make([]int, t)
			for i := 0; i < t; i++ {
				fmt.Scan(&a[i])
			}
			for i := 0; i < t; i++ {
				sum += a[i]
			}
		}
		fmt.Println(sum)
	}
}

代码2:

package main

import(
    "fmt"
)

func main(){
    var t,crr,sum int
    for {
        n,_ := fmt.Scan(&t)
        if n == 0{
            break
        }else{
            sum = 0
            for i:=0;i<t;i++{
                fmt.Scan(&crr)
                sum += crr
            }
            fmt.Println(sum)
        }
    }
    
}

知道行数

输入描述:
输入的第一行包括一个正整数t(1 <= t <= 100), 表示数据组数。
接下来t行, 每行一组数据。
每行的第一个整数为整数的个数n(1 <= n <= 100)。
接下来n个正整数, 即需要求和的每个正整数。

输出描述:
每组数据输出求和的结果

输入例子1:
2
4 1 2 3 4
5 1 2 3 4 5

输出例子1:
10
15

代码:

package main

import (
	"fmt"
)

func main() {
	var t int
	fmt.Scan(&t)
	for i := 0; i < t; i++ {
		var num, sum, a int
		fmt.Scan(&num)
		for i := 0; i < num; i++ {
			fmt.Scan(&a)
			sum += a
		}
		fmt.Println(sum)
	}
}

二、必须整行读(用 fmt、os、bufio、strconv、strings 实现)

每行数字数量不固定,且不知道数量

输入描述:
输入数据有多组, 每行表示一组输入数据。

每行不定有n个整数,空格隔开。(1 <= n <= 100)。

输出描述:
每组数据输出求和的结果

输入例子1:
1 2 3
4 5
0 0 0 0 0

输出例子1:
6
9
0

这个时候我们需要一整行一整行地读,这时需要用到 bufio 包:

代码:

package main

import (
    "bufio"
    "fmt"
    "os"
    "strconv"
    "strings"
)

func main() {
    inputs := bufio.NewScanner(os.Stdin)
    for inputs.Scan() {  //每次读入一行
        data := strings.Split(inputs.Text(), " ")  //通过空格将他们分割,并存入一个字符串切片
        var sum int
        for i := range data {
            val, _ := strconv.Atoi(data[i])   //将字符串转换为int
            sum += val
        }
        fmt.Println(sum)
    }
}

三、读字符串

1. 读一行字符串

输入描述:
输入有两行,第一行n
第二行是n个字符串,字符串之间用空格隔开

输出描述:
输出一行排序后的字符串,空格隔开,无结尾空格

输入例子1:
5
c d a bb e

输出例子1:
a bb c d e

代码:

package main
import(
    "fmt"
    "os"
    "bufio"
    "sort"
    "strings"
)
 
func main(){
    in := bufio.NewScanner(os.Stdin)
    in.Scan()
    for in.Scan(){
        str := in.Text()
        s := strings.Split(str, " ")
        sort.Strings(s)  //排序
        fmt.Println(strings.Join(s," "))  //将切片连接成字符串
    }
}

2. 读多行字符串

输入描述:
多个测试用例,每个测试用例一行。

每行通过空格隔开,有n个字符,n<100

输出描述:
对于每组测试用例,输出一行排序过的字符串,每个字符串通过空格隔开

输入例子1:
a c bb
f dddd
nowcoder

输出例子1:
a bb c
dddd f
nowcoder

代码:

package main

import (
    "fmt"
    "bufio"
    "os"
    "strings"
    "sort"
)

func main(){
    input := bufio.NewScanner(os.Stdin)
    for input.Scan(){
        data := strings.Split(input.Text()," ")
        sort.Strings(data)
        fmt.Println(strings.Join(data, " "))
	}
}
  • 13
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
ACM竞赛中,通常会有多组输入数据需要处理。根据给出的代码示例,可以看到输入数据有多组,每组数据以空格隔开的整数表示。每行的整数数量不固定,且不知道数量。输出需要求和的结果。 为了读取输入数据,你可以使用fmt包中的Scan函数,该函数可以读取从标准输入中获取的数据。 可以按照以下步骤来读取输入数据: 1. 使用fmt.Scan函数读取变量t,该变量表示每组数据中整数的数量。 2. 使用一个循环,该循环次数为t次,用来读取每个整数并求和。 3. 在循环中,使用fmt.Scan函数读取变量a,该变量表示当前要求和的整数。 4. 将读取的整数累加到sum变量中。 5. 循环结束后,输出sum变量的值。 下面是一个示例代码,用来实现上述步骤: ```go package main import ( "fmt" ) func main() { var t int for { var sum int n, _ := fmt.Scan(&t) if n == 0 { break } else { a := make([]int, t) for i := 0; i < t; i++ { fmt.Scan(&a[i]) } for i := 0; i < t; i++ { sum += a[i] } } fmt.Println(sum) } } ``` 此代码示例使用了一个无限循环来处理多组输入数据,直到输入的整数为0才退出循环。每次循环开始时,sum变量被重置为0,用来计算当前组数据的和。在内部循环中,通过make函数创建了一个切片a来存储每个整数,然后将每个整数累加到sum变量中。最后,输出sum变量的值。 希望这个回答对您有帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值