diff --git a/LC2/1.go b/LC2/1.go new file mode 100644 index 0000000..4dc64a3 --- /dev/null +++ b/LC2/1.go @@ -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) +} diff --git a/LC2/2.go b/LC2/2.go new file mode 100644 index 0000000..9e4d15a --- /dev/null +++ b/LC2/2.go @@ -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) +} diff --git a/LC2/3.go b/LC2/3.go new file mode 100644 index 0000000..8fc4915 --- /dev/null +++ b/LC2/3.go @@ -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) + } +} diff --git a/LC2/4.go b/LC2/4.go new file mode 100644 index 0000000..50458a2 --- /dev/null +++ b/LC2/4.go @@ -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) + } +} diff --git a/LC2/5.go b/LC2/5.go new file mode 100644 index 0000000..0461dc3 --- /dev/null +++ b/LC2/5.go @@ -0,0 +1,15 @@ +//go:build ignore + +// 读取字符串:读入一个单词,输出其长度 +// 输入示例:hello +// 输出示例:5 +package main + +import "fmt" + +func main() { + var s string + // TODO: 读入字符串 s + + fmt.Println(len(s)) +} diff --git a/LC2/6.go b/LC2/6.go new file mode 100644 index 0000000..855ae72 --- /dev/null +++ b/LC2/6.go @@ -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) + } +} diff --git a/LC2/7.go b/LC2/7.go new file mode 100644 index 0000000..ea1d0f3 --- /dev/null +++ b/LC2/7.go @@ -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) +} diff --git a/LC2/README.md b/LC2/README.md new file mode 100644 index 0000000..0670da9 --- /dev/null +++ b/LC2/README.md @@ -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. **类型匹配**:确保变量类型与输入格式匹配