add LC2 skeleton files for 7 ACM I/O patterns
This commit is contained in:
@@ -0,0 +1,15 @@
|
|||||||
|
//go:build ignore
|
||||||
|
|
||||||
|
// 两数之和:读入两个整数,输出它们的和
|
||||||
|
// 输入示例:3 5
|
||||||
|
// 输出示例:8
|
||||||
|
package main
|
||||||
|
|
||||||
|
import "fmt"
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
// TODO: 读入两个整数 a, b
|
||||||
|
a, b := 0, 0
|
||||||
|
|
||||||
|
fmt.Println(a + b)
|
||||||
|
}
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
//go:build ignore
|
||||||
|
|
||||||
|
// 数组求和:先读入 n,再读入 n 个整数,输出总和
|
||||||
|
// 输入示例:
|
||||||
|
// 5
|
||||||
|
// 1 2 3 4 5
|
||||||
|
// 输出示例:15
|
||||||
|
package main
|
||||||
|
|
||||||
|
import "fmt"
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
var n int
|
||||||
|
// TODO: 读入 n
|
||||||
|
|
||||||
|
arr := make([]int, n)
|
||||||
|
// TODO: 用循环读入 n 个整数到 arr
|
||||||
|
|
||||||
|
sum := 0
|
||||||
|
for _, v := range arr {
|
||||||
|
sum += v
|
||||||
|
}
|
||||||
|
fmt.Println(sum)
|
||||||
|
}
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
//go:build ignore
|
||||||
|
|
||||||
|
// 多行输入,每行两个数,输出每行之和(EOF 结束)
|
||||||
|
// 输入示例:
|
||||||
|
// 1 2
|
||||||
|
// 3 4
|
||||||
|
// 5 6
|
||||||
|
// 输出示例:
|
||||||
|
// 3
|
||||||
|
// 7
|
||||||
|
// 11
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
var a, b int
|
||||||
|
for {
|
||||||
|
// TODO: 读入 a, b,遇到 EOF 退出循环
|
||||||
|
|
||||||
|
fmt.Println(a + b)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
//go:build ignore
|
||||||
|
|
||||||
|
// 多组测试数据(EOF 结束):每组先读 n,再读 n 个数,输出总和
|
||||||
|
// 输入示例:
|
||||||
|
// 3
|
||||||
|
// 1 2 3
|
||||||
|
// 2
|
||||||
|
// 4 5
|
||||||
|
// 输出示例:
|
||||||
|
// 6
|
||||||
|
// 9
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
for {
|
||||||
|
var n int
|
||||||
|
// TODO: 读入 n,遇到 EOF 退出循环
|
||||||
|
|
||||||
|
sum := 0
|
||||||
|
for i := 0; i < n; i++ {
|
||||||
|
var x int
|
||||||
|
// TODO: 读入 x
|
||||||
|
sum += x
|
||||||
|
}
|
||||||
|
fmt.Println(sum)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
//go:build ignore
|
||||||
|
|
||||||
|
// 读取字符串:读入一个单词,输出其长度
|
||||||
|
// 输入示例:hello
|
||||||
|
// 输出示例:5
|
||||||
|
package main
|
||||||
|
|
||||||
|
import "fmt"
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
var s string
|
||||||
|
// TODO: 读入字符串 s
|
||||||
|
|
||||||
|
fmt.Println(len(s))
|
||||||
|
}
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
//go:build ignore
|
||||||
|
|
||||||
|
// 特定结束符:读入整数,输入 0 时结束,每行输出该数的两倍
|
||||||
|
// 输入示例:
|
||||||
|
// 1
|
||||||
|
// 2
|
||||||
|
// 3
|
||||||
|
// 0
|
||||||
|
// 输出示例:
|
||||||
|
// 2
|
||||||
|
// 4
|
||||||
|
// 6
|
||||||
|
package main
|
||||||
|
|
||||||
|
import "fmt"
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
for {
|
||||||
|
var n int
|
||||||
|
// TODO: 读入 n
|
||||||
|
|
||||||
|
if n == 0 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
fmt.Println(n * 2)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
//go:build ignore
|
||||||
|
|
||||||
|
// 读取不定长行:读入一行空格分隔的整数,输出它们的和
|
||||||
|
// 输入示例:1 2 3 4 5
|
||||||
|
// 输出示例:15
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bufio"
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
scanner := bufio.NewScanner(os.Stdin)
|
||||||
|
scanner.Scan()
|
||||||
|
line := scanner.Text()
|
||||||
|
|
||||||
|
parts := strings.Fields(line)
|
||||||
|
sum := 0
|
||||||
|
for _, s := range parts {
|
||||||
|
n, _ := strconv.Atoi(s)
|
||||||
|
sum += n
|
||||||
|
}
|
||||||
|
fmt.Println(sum)
|
||||||
|
}
|
||||||
+284
@@ -0,0 +1,284 @@
|
|||||||
|
# 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. **类型匹配**:确保变量类型与输入格式匹配
|
||||||
Reference in New Issue
Block a user