Files
acm-code/LC2/README.md
T

285 lines
3.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Go 语言 ACM 格式输入输出教程
## 基础输入函数
使用 `fmt.Scan` 系列函数(不使用 bufio 缓冲区):
| 函数 | 说明 |
|------|------|
| `fmt.Scan(&a)` | 读取一个值,以空格/换行分隔 |
| `fmt.Scanf("%d", &a)` | 带格式说明符读取 |
| `fmt.Scanln(&a)` | 读取一行,以换行结束 |
| `fmt.Sscan(str, &a)` | 从字符串读取 |
---
## 示例 1:单行读取两个整数
**输入:**
```
3 5
```
**代码:**
```go
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
```
**代码:**
```go
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
```
**代码:**
```go
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
```
**代码:**
```go
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
```
**代码:**
```go
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
```
**代码:**
```go
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
```
**代码:**
```go
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()
}
```
---
## 常用输出格式
```go
// 换行输出
fmt.Println(a, b)
// 空格分隔不换行
fmt.Print(a, " ", b)
// 格式化输出
fmt.Printf("%d %d\n", a, b)
// 拼接字符串输出
fmt.Println(strings.Join(strs, " "))
```
---
## 练习模板
```go
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. **类型匹配**:确保变量类型与输入格式匹配