rust - 我的测试失败于 "attempt to subtract with overflow"

标签 rust overflow

use itertools::Itertools;

#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord)]
struct Runner {
    sec: u16,
}

impl Runner {
    fn from(v: (u8, u8, u8)) -> Runner {
        Runner {
            sec: v.0 as u16 * 3600 + v.1 as u16 * 60 + v.2 as u16
        }
    }
}


fn parse_runner(strg: &str) -> Vec<Runner> {
    strg.split(", ")
        .flat_map(|personal_result| personal_result.split('|'))
        .map(|x| x.parse::<u8>().unwrap())
        .tuples::<(_, _, _)>()
        .map(|x| Runner::from(x))
        .sorted()
        .collect::<Vec<Runner>>()
}

fn parse_to_format(x: u16) -> String {
    let h = x / 3600;
    let m = (x - 3600)/60;
    let s = x % 60;

    format!("{:02}|{:02}|{:02}", h, m, s)
}

fn return_stats(runners: &[Runner]) -> String {
    let range: u16 = runners.last().unwrap().sec - runners.first().unwrap().sec;
    let average: u16 = runners.iter().map(|&r| r.sec).sum::<u16>()/(runners.len() as u16);
    let median: u16 = if runners.len()%2 != 0 {
        runners.get(runners.len()/2).unwrap().sec
    } else {
        runners.get(runners.len()/2).unwrap().sec/2 + runners.get((runners.len()/2) + 1).unwrap().sec/2
    };
    format!("Range: {} Average: {} Median: {}", parse_to_format(range), parse_to_format(average), parse_to_format(median))

}

fn stati(strg: &str) -> String {
    let run_vec = parse_runner(strg);
    return_stats(&run_vec)
}

我找不到我用减法使我的代码通过测试所犯的错误。基本上我试图从像“01|15|59, 1|47|6, 01|17|20, 1|32|34, 2|3|17”这样的 &str 开始,并以另一个像“范围:00|47|18 平均值:01|35|15 中值:01|32|34"

如果我的错误真的很愚蠢,请提前道歉,我已经尝试修复它很长一段时间了

https://www.codewars.com/kata/55b3425df71c1201a800009c/train/rust

最佳答案

let m = (x - 3600) / 60;

正如 Peter 提到的,如果 x 小于 3600,则确实会溢出。u16 不能为负数。

使用整数算术,这是将秒格式化为 hh|mm|ss 并且不会溢出的另一种方法:

fn seconds_to_hhmmss(mut s: u64) -> String {
    let h = s / 3600;
    s -= h * 3600;
    let m = s / 60;
    s -= m * 60;
    
    format!("{:02}|{:02}|{:02}", h, m, s)
}

关于rust - 我的测试失败于 "attempt to subtract with overflow",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66754977/

相关文章:

overflow - 溢出时容器上方和下方的CSS神秘空白: hidden is used on an inline-block

html - 在父元素的一个子元素上水平滚动

rust - 通用枚举和 impl,无法使用

typescript - 使用额外的 `id` 属性将 Rust 结构展平回 TypeScript 单个对象,以返回 wasm-bindgen 函数

html - 如何为溢出隐藏的div提供填充底部?

css - 创建一个扩展为包含一个 block 的 div,但让另一个 block 流到它外面

rust - 如何使用macro_rules 定义带有可选#[cfg] 的结构?

rust - 为什么这两个非常相似的异步 Rust 函数之一会触发线程安全错误?

random - 如何在Rust中使用HC-128生成随机数?

java - 在 Java 中使用 System.nanoTime() 时,为什么我应该使用 t1 - t0 < 0,而不是 t1 < t0