引言

九九乘法表是编程初学者的经典练习,也是掌握嵌套循环的绝佳案例。在Rust中,我们可以用不同的方式打印九九乘法表,每种方式都展现了不同的编程技巧和Rust特性。

本文将详细讲解如何在Rust中实现九九乘法表的四种方向:

  1. 标准方向:左上到右下,完整的乘法表
  2. 上三角方向:只显示上三角部分(i≤j)
  3. 下三角方向:只显示下三角部分(i≥j)
  4. 倒序方向:从大到小的反向打印

每种实现方式都将包含:

  • 核心代码实现
  • 代码详细解析
  • 输出效果展示
  • 优化版本和变体
  • Rust特性应用

通过本文的学习,你将能够:

  • 熟练使用嵌套循环解决实际问题
  • 理解不同循环控制的方式
  • 掌握Rust的格式化输出
  • 学习代码优化和重构技巧

1. 标准九九乘法表(完整版)

1.1 基本实现

这是最常见的九九乘法表格式,显示所有9×9的乘法结果:

fn main() {
    println!("=== 标准九九乘法表 ===");
    
    for i in 1..=9 {
        for j in 1..=9 {
            print!("{}×{}={}\t", j, i, i * j);
        }
        println!();
    }
}

在这里插入图片描述

输出效果

代码解析

  • i 控制行(被乘数)
  • j 控制列(乘数)
  • 使用 \t(制表符)对齐
  • 每行结束后用 println!() 换行

1.2 优化版本:对齐格式

fn main() {
    println!("=== 标准九九乘法表(对齐版) ===");
    
    for i in 1..=9 {
        for j in 1..=9 {
            print!("{:2}×{:2}={:2}\t", j, i, i * j);
        }
        println!();
    }
}

在这里插入图片描述

代码解析

  • {:2} 表示最小宽度为2,右对齐
  • 确保数字小于10时也有固定宽度

1.3 添加分隔线和标题

fn main() {
    println!("=== 标准九九乘法表(完整版) ===");
    // 使用 format! 进行字符串拼接,避免直接使用 + 运算符
    println!("┌{}┐", "─".repeat(80));
    
    for i in 1..=9 {
        print!("│ ");
        for j in 1..=9 {
            // 使用 {:<8} 控制宽度(原 \t 可能导致对齐不一致)
            print!("{}×{}={:<8}", j, i, i * j);
        }
        println!("│");
        if i < 9 {
            println!("├{}┤", "─".repeat(80));
        }
    }
    
    println!("└{}┘", "─".repeat(80));
}

在这里插入图片描述

关键点

  • 使用 {:<3} 左对齐,宽度3
  • 使用Unicode字符绘制表格边框

2. 上三角九九乘法表(i ≤ j)

2.1 基本实现

只显示上三角部分,避免重复显示相同的乘法(如3×2和2×3):

fn main() {
    println!("=== 上三角九九乘法表 ===");
    
    for i in 1..=9 {
        for j in 1..=9 {
            if j >= i {  // 只显示 j >= i 的部分
                print!("{}×{}={}\t", i, j, i * j);
            } else {
                print!("\t");  // 空白对齐·看情况写一个或两个\t
            }
        }
        println!();
    }
}

输出效果
在这里插入图片描述

2.2 优化版本:紧凑对齐

fn main() {
    println!("=== 上三角九九乘法表(紧凑版) ===");
    
    for i in 1..=9 {
        for _ in 1..i {
            print!("        ");  // 8个空格对齐
        }
        for j in i..=9 {
            print!("{}×{}={:<3}\t", i, j, i * j);
        }
        println!();
    }
}

在这里插入图片描述

代码解析

  • 第一个循环打印前导空格
  • 第二个循环只打印 j>=i 的部分
  • 更清晰的控制流

2.3 使用continue优化

fn main() {
    println!("=== 上三角九九乘法表(continue版) ===");
    
    for i in 1..=9 {
        for j in 1..=9 {
            if j < i {
                print!("        ");  // 空白
                continue;
            }
            print!("{}×{}={:<3}\t", i, j, i * j);
        }
        println!();
    }
}

在这里插入图片描述

3. 下三角九九乘法表(i ≥ j)

3.1 基本实现

只显示下三角部分,另一种避免重复的方式:

fn main() {
    println!("=== 下三角九九乘法表 ===");
    
    for i in 1..=9 {
        for j in 1..=i {  // 只显示 j <= i 的部分
            print!("{}×{}={}\t", j, i, i * j);
        }
        println!();
    }
}

输出效果
在这里插入图片描述

代码解析

  • j 的范围是 1..=i,而不是 1..=9
  • 每行的项数等于行号
  • 更简洁的实现

3.2 优化版本:更好的对齐

fn main() {
    println!("=== 下三角九九乘法表(对齐版) ===");
    
    for i in 1..=9 {
        for j in 1..=i {
            print!("{}×{}={:<3}\t", j, i, i * j);
        }
        // 填充剩余空格以对齐
        for _ in (i + 1)..=9 {
            print!("        ");
        }
        println!();
    }
}

3.3 使用不同的格式

fn main() {
    println!("=== 下三角九九乘法表(格式化版) ===");
    
    for i in 1..=9 {
        for j in 1..=i {
            let result = i * j;
            if result < 10 {
                print!("{}×{}={}    ", j, i, result);
            } else {
                print!("{}×{}={}   ", j, i, result);
            }
        }
        println!();
    }
}

4. 倒序九九乘法表(从大到小)

4.1 基本实现

从9×9开始,倒序打印到1×1:

fn main() {
    println!("=== 倒序九九乘法表 ===");
    
    for i in (1..=9).rev() {  // 从9到1
        for j in (1..=9).rev() {  // 从9到1
            print!("{}×{}={}\t", j, i, i * j);
        }
        println!();
    }
}

输出效果
在这里插入图片描述


**代码解析**:
- `(1..=9).rev()` 使用迭代器的 `rev()` 方法反转
- 从大到小的打印顺序

### 4.2 倒序下三角版本

```rust
fn main() {
    println!("=== 倒序下三角九九乘法表 ===");
    
    for i in (1..=9).rev() {
        for j in (1..=i).rev() {  // 倒序的下三角
            print!("{}×{}={}\t", j, i, i * j);
        }
        println!();
    }
}

输出效果
在这里插入图片描述

4.3 倒序上三角版本

fn main() {
    println!("=== 倒序上三角九九乘法表 ===");
    
    for i in (1..=9).rev() {
        for j in (1..=9).rev() {
            if j >= i {
                print!("{}×{}={}\t", i, j, i * j);
            } else {
                print!("\t\t");
            }
        }
        println!();
    }
}

在这里插入图片描述

5. 综合对比与代码重构

5.1 统一接口的函数式实现

enum TableType {
    Full,        // 完整版
    UpperTri,    // 上三角
    LowerTri,    // 下三角
    Reverse,     // 倒序
}

fn print_multiplication_table(table_type: TableType) {
    match table_type {
        TableType::Full => {
            println!("=== 标准九九乘法表 ===");
            for i in 1..=9 {
                for j in 1..=9 {
                    print!("{}×{}={:<3}\t", j, i, i * j);
                }
                println!();
            }
        }
        
        TableType::UpperTri => {
            println!("=== 上三角九九乘法表 ===");
            for i in 1..=9 {
                for _ in 1..i {
                    print!("        ");
                }
                for j in i..=9 {
                    print!("{}×{}={:<3}\t", i, j, i * j);
                }
                println!();
            }
        }
        
        TableType::LowerTri => {
            println!("=== 下三角九九乘法表 ===");
            for i in 1..=9 {
                for j in 1..=i {
                    print!("{}×{}={:<3}\t", j, i, i * j);
                }
                println!();
            }
        }
        
        TableType::Reverse => {
            println!("=== 倒序九九乘法表 ===");
            for i in (1..=9).rev() {
                for j in (1..=9).rev() {
                    print!("{}×{}={:<3}\t", j, i, i * j);
                }
                println!();
            }
        }
    }
}

fn main() {
    print_multiplication_table(TableType::Full);
    println!();
    print_multiplication_table(TableType::UpperTri);
    println!();
    print_multiplication_table(TableType::LowerTri);
    println!();
    print_multiplication_table(TableType::Reverse);
}

在这里插入图片描述

5.2 使用结构体和方法

struct MultiplicationTable {
    size: u32,
}

impl MultiplicationTable {
    fn new(size: u32) -> Self {
        Self { size }
    }
    
    fn print_full(&self) {
        println!("=== 标准九九乘法表({}×{}) ===", self.size, self.size);
        for i in 1..=self.size {
            for j in 1..=self.size {
                print!("{}×{}={:<3}\t", j, i, i * j);
            }
            println!();
        }
    }
    
    fn print_upper_triangle(&self) {
        println!("=== 上三角九九乘法表({}×{}) ===", self.size, self.size);
        for i in 1..=self.size {
            for _ in 1..i {
                print!("        ");
            }
            for j in i..=self.size {
                print!("{}×{}={:<3}\t", i, j, i * j);
            }
            println!();
        }
    }
    
    fn print_lower_triangle(&self) {
        println!("=== 下三角九九乘法表({}×{}) ===", self.size, self.size);
        for i in 1..=self.size {
            for j in 1..=i {
                print!("{}×{}={:<3}\t", j, i, i * j);
            }
            println!();
        }
    }
    
    fn print_reverse(&self) {
        println!("=== 倒序九九乘法表({}×{}) ===", self.size, self.size);
        for i in (1..=self.size).rev() {
            for j in (1..=self.size).rev() {
                print!("{}×{}={:<3}\t", j, i, i * j);
            }
            println!();
        }
    }
}

fn main() {
    let table = MultiplicationTable::new(9);
    
    table.print_full();
    println!();
    table.print_upper_triangle();
    println!();
    table.print_lower_triangle();
    println!();
    table.print_reverse();
}

在这里插入图片描述

6. 高级特性应用

6.1 使用迭代器和函数式风格

fn main() {
    println!("=== 使用迭代器的九九乘法表 ===");
    
    (1..=9)
        .map(|i| {
            (1..=9)
                .map(|j| format!("{}×{}={}", j, i, i * j))
                .collect::<Vec<_>>()
                .join("\t")
        })
        .for_each(|row| println!("{}", row));
}

6.2 上三角的迭代器版本

fn main() {
    println!("=== 迭代器版上三角九九乘法表 ===");
    
    for i in 1..=9 {
        let padding: String = (1..i).map(|_| "        ").collect();
        let row: String = (i..=9)
            .map(|j| format!("{}×{}={:<3}", i, j, i * j))
            .collect::<Vec<_>>()
            .join("\t");
        println!("{}{}", padding, row);
    }
}

6.3 使用宏简化代码

macro_rules! print_cell {
    ($a:expr, $b:expr) => {
        print!("{}×{}={:<3}\t", $a, $b, $a * $b);
    };
}

fn main() {
    println!("=== 使用宏的九九乘法表 ===");
    
    for i in 1..=9 {
        for j in 1..=9 {
            print_cell!(j, i);
        }
        println!();
    }
}

7. 性能优化和最佳实践

7.1 字符串预分配

fn main() {
    println!("=== 优化版九九乘法表 ===");
    
    // 预分配字符串,减少内存分配
    let mut output = String::with_capacity(1000);
    
    for i in 1..=9 {
        output.clear();
        for j in 1..=9 {
            output.push_str(&format!("{}×{}={:<3}\t", j, i, i * j));
        }
        println!("{}", output);
    }
}

7.2 避免重复计算

fn main() {
    println!("=== 避免重复计算的九九乘法表 ===");
    
    for i in 1..=9 {
        for j in 1..=i {  // 只计算下三角
            let result = i * j;
            print!("{}×{}={:<3}\t", j, i, result);
        }
        println!();
    }
}

8. 美化输出版本

8.1 带边框的表格

fn main() {
    println!("╔══════════════════════════════════════════════════════════════╗");
    println!("║                   九九乘法表                                ║");
    println!("╠══════════════════════════════════════════════════════════════╣");
    
    for i in 1..=9 {
        print!("║ ");
        for j in 1..=9 {
            print!("{}×{}={:<3}\t", j, i, i * j);
        }
        println!("║");
    }
    
    println!("╚══════════════════════════════════════════════════════════════╝");
}

8.2 彩色输出(使用ANSI转义码)

fn main() {
    const RESET: &str = "\x1b[0m";
    const RED: &str = "\x1b[31m";
    const GREEN: &str = "\x1b[32m";
    const YELLOW: &str = "\x1b[33m";
    
    println!("=== 彩色九九乘法表 ===");
    
    for i in 1..=9 {
        for j in 1..=9 {
            let color = if i == j {
                RED
            } else if i * j < 10 {
                GREEN
            } else {
                YELLOW
            };
            
            print!("{}{}×{}={:<3}{}\t", color, j, i, i * j, RESET);
        }
        println!();
    }
}

9. 完整示例程序

use std::io;

fn show_menu() {
    println!("\n=== 九九乘法表程序 ===");
    println!("1. 标准九九乘法表(完整版)");
    println!("2. 上三角九九乘法表");
    println!("3. 下三角九九乘法表");
    println!("4. 倒序九九乘法表");
    println!("5. 显示所有版本");
    println!("0. 退出");
    print!("请选择(0-5): ");
}

fn print_full_table() {
    println!("\n=== 标准九九乘法表 ===");
    for i in 1..=9 {
        for j in 1..=9 {
            print!("{}×{}={:<3}\t", j, i, i * j);
        }
        println!();
    }
}

fn print_upper_triangle() {
    println!("\n=== 上三角九九乘法表 ===");
    for i in 1..=9 {
        for _ in 1..i {
            print!("        ");
        }
        for j in i..=9 {
            print!("{}×{}={:<3}\t", i, j, i * j);
        }
        println!();
    }
}

fn print_lower_triangle() {
    println!("\n=== 下三角九九乘法表 ===");
    for i in 1..=9 {
        for j in 1..=i {
            print!("{}×{}={:<3}\t", j, i, i * j);
        }
        println!();
    }
}

fn print_reverse() {
    println!("\n=== 倒序九九乘法表 ===");
    for i in (1..=9).rev() {
        for j in (1..=9).rev() {
            print!("{}×{}={:<3}\t", j, i, i * j);
        }
        println!();
    }
}

fn print_all() {
    print_full_table();
    println!();
    print_upper_triangle();
    println!();
    print_lower_triangle();
    println!();
    print_reverse();
}

fn main() {
    loop {
        show_menu();
        
        let mut choice = String::new();
        io::stdin()
            .read_line(&mut choice)
            .expect("读取输入失败");
        
        let choice: u32 = match choice.trim().parse() {
            Ok(num) => num,
            Err(_) => {
                println!("无效输入,请重新选择!");
                continue;
            }
        };
        
        match choice {
            1 => print_full_table(),
            2 => print_upper_triangle(),
            3 => print_lower_triangle(),
            4 => print_reverse(),
            5 => print_all(),
            0 => {
                println!("再见!");
                break;
            }
            _ => println!("无效选择,请重新输入!"),
        }
    }
}

在这里插入图片描述
在这里插入图片描述

10. 总结对比

10.1 四种方向的对比表

方向 特点 循环范围 适用场景
标准版 显示所有乘积 1..=9 × 1..=9 完整学习乘法
上三角 避免重复,j≥i j in i..=9 简洁展示,节省空间
下三角 避免重复,j≤i j in 1..=i 最简洁的实现
倒序版 从大到小 (1..=9).rev() 反向思维训练

10.2 代码复杂度对比

方向 代码行数 嵌套层数 条件判断
标准版 最少 2层
上三角 中等 2-3层 需要
下三角 最少 2层 无(通过范围控制)
倒序版 中等 2层

10.3 学习建议

  1. 初学者:从标准版开始,理解基本嵌套循环
  2. 进阶学习:掌握下三角版,理解范围控制
  3. 提高训练:实现上三角版,练习条件判断
  4. 深入理解:倒序版,掌握迭代器方法
Logo

新一代开源开发者平台 GitCode,通过集成代码托管服务、代码仓库以及可信赖的开源组件库,让开发者可以在云端进行代码托管和开发。旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐