洛谷 P1001的Rust解法

· · 个人记录

本人近期闲着无聊,开始用Rust来AC题目,并且会持续在这里更新各个题的Rust解法。

前排提示:用Rust来做算法竞赛就是自己找罪受,别怪我没有提醒你!正常竞赛,还是老老实实的用C++的好

所以,对于算法竞赛而言,我们肯定是从P1001(A+B Problem)开始啦! 首先嘛,Rust没有cin这种东西,因此输入数字的时候几个数字是否在同一行很重要。此处提供输入一行数字的代码:

fn read_numbers_in_line() -> Vec<i32> {
    let mut buffer = String::new();
    std::io::stdin().read_line(&mut buffer).unwrap();
    buffer.split(" ").filter_map(|x| {
        x.trim().parse::<i32>().ok()
    }).collect()
}

当然,对于A+B Problem这么简单的东西,根本没必要上这个。 那么话不多说,先上代码!


fn main() {
    let stdin = std::io::stdin();
    let mut line_buffer = String::new();
    stdin.read_line(&mut line_buffer).expect("Can't read line");
    let trimed_line_buffer = line_buffer.trim();
    let splitted_line_buffer: Vec<&str> = trimed_line_buffer.split(" ").collect();
    let a: i32 = splitted_line_buffer[0].parse().expect("cannot parse to int!");
    let b: i32 = splitted_line_buffer[1].parse().expect("cannot parse to int!");
    println!("{}", a + b);
}

在Rust中,我们认为输入是有可能失败的(比如说,没有stdin?虽然这种情况很罕见,但还是存在的)。因此,Stdin::read_line()这个方法会返回一个std::io::Result<usize>的值来标识有没有失败。如果你不处理的话,它会爆出警告,这令人十分难受,所以我们应该处理它,也就是通过expect或者unwrap来强制拆包(这里注意,如果数据中因为编码问题出现了别的奇怪字符,这里的拆包就会panic导致RE,所以Rust是用来检测测试样例里面有没有非法字符的绝佳工具!笔者就遇到过,后来果然是题目的问题)。 然后我们就读入了一行字符串,将其用空格分割。注意这里读出来的字符串是带有换行符的,因此要先trim去掉换行符(也可以用切片)。然后就是常规操作啦~字符串转数字用parse(这里返回的也是Result,注意),然后再输出就行啦~属实非常的简单呢