Files
acm-code/LC2/README.md
T

3.5 KiB
Raw Blame History

Go 语言 ACM 格式输入输出教程

基础输入函数

使用 fmt.Scan 系列函数(不使用 bufio 缓冲区):

函数 说明
fmt.Scan(&a) 读取一个值,以空格/换行分隔
fmt.Scanf("%d", &a) 带格式说明符读取
fmt.Scanln(&a) 读取一行,以换行结束
fmt.Sscan(str, &a) 从字符串读取

示例 1:单行读取两个整数

输入:

3 5

代码:

package main

import "fmt"

func main() {
    var a, b int
    fmt.Scan(&a, &b)
    fmt.Println(a + b)
}

示例 2:先给 n,再读 n 个数

输入:

5
1 2 3 4 5

代码:

package main

import "fmt"

func main() {
    var n int
    fmt.Scan(&n)

    arr := make([]int, n)
    for i := 0; i < n; i++ {
        fmt.Scan(&arr[i])
    }

    // 计算总和
    sum := 0
    for _, v := range arr {
        sum += v
    }
    fmt.Println(sum)
}

示例 3:多行输入,每行两个数

输入:

1 2
3 4
5 6

代码:

package main

import (
    "fmt"
    "io"
)

func main() {
    var a, b int
    for {
        _, err := fmt.Scan(&a, &b)
        if err == io.EOF {
            break
        }
        fmt.Println(a + b)
    }
}

示例 4:多组测试数据(EOF 结束)

输入:

3
1 2 3
2
4 5

代码:

package main

import (
    "fmt"
    "io"
)

func main() {
    for {
        var n int
        _, err := fmt.Scan(&n)
        if err == io.EOF {
            break
        }

        sum := 0
        for i := 0; i < n; i++ {
            var x int
            fmt.Scan(&x)
            sum += x
        }
        fmt.Println(sum)
    }
}

示例 5:读取字符串

输入:

hello world

代码:

package main

import "fmt"

func main() {
    var s string
    fmt.Scan(&s) // 只读到空格前
    fmt.Println(s) // 输出: hello

    // 读取整行
    fmt.Scanln() // 清除换行符
    var line string
    fmt.Scanln(&line)
    fmt.Println(line) // 输出: world
}

示例 6:特定结束符(输入 0 结束)

输入:

1
2
3
0

代码:

package main

import "fmt"

func main() {
    for {
        var n int
        fmt.Scan(&n)
        if n == 0 {
            break
        }
        fmt.Println(n * 2)
    }
}

示例 7:读取不定长行(空格分隔)

输入:

1 2 3 4 5

代码:

package main

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

func main() {
    scanner := bufio.NewScanner(os.Stdin)
    scanner.Scan()
    line := scanner.Text()

    parts := strings.Fields(line)
    for _, s := range parts {
        n, _ := strconv.Atoi(s)
        fmt.Print(n, " ")
    }
    fmt.Println()
}

常用输出格式

// 换行输出
fmt.Println(a, b)

// 空格分隔不换行
fmt.Print(a, " ", b)

// 格式化输出
fmt.Printf("%d %d\n", a, b)

// 拼接字符串输出
fmt.Println(strings.Join(strs, " "))

练习模板

package main

import (
    "fmt"
    "io"
)

func main() {
    // 在这里写你的代码
    var n int
    if _, err := fmt.Scan(&n); err == io.EOF {
        return
    }

    // 处理逻辑
    fmt.Println(n)
}

注意事项

  1. 输入输出效率:纯 fmt.Scan 对于大量数据(>10^5)会较慢
  2. 换行符处理:fmt.Scan 会自动跳过空格和换行
  3. EOF 检测:用 io.EOF 判断输入结束
  4. 类型匹配:确保变量类型与输入格式匹配