在检查 armstrong 数时如何处理整数溢出?

How do I handle integer overflow while checking for armstrong numbers?

提问人:sidharth singh 提问时间:10/18/2023 最后编辑:cafce25sidharth singh 更新时间:10/18/2023 访问量:50

问:

在解决 exercism 问题时,我未能通过以下测试用例: 测试失败

thread 'properly_handles_overflow' panicked at 'attempt to add with overflow', src/lib.rs:9:9
use std::io;
pub fn is_armstrong_number(mut num: u32) -> bool {
    let check = num;
    let mut sum = 0;
    let length = (num as f64).log(10.0).floor() as u32 + 1;

    while num != 0 {
        let digit = num % 10;
        sum += u32::pow(digit, length);
        num = num / 10;
    }
    if sum == check {
        return true;
    } else {
        return false;
    }
}

fn main() {
    let mut input = String::new();
    io::stdin().read_line(&mut input);
    let number: u32 = input.trim().parse().unwrap();

    is_armstrong_number(number);
}

Rust 整数溢出

评论

1赞 Holloway 10/18/2023
(格式编辑已恢复,以便错误消息中的行号仍与正确的代码行相关。OP,如果代码格式化为正常的 rust 约定,它会更容易阅读(rustfmt 默认值是一个很好的起点))
1赞 cafce25 10/18/2023
请将任意用户输入的解析替换为发现错误时实际传递的数字。您可以在有关最小可重现示例的文章中阅读相关内容
1赞 Sven Marnach 10/18/2023
唯一可以溢出的操作是计算 some 中的加法。您应该使用 ,而不是使用 ,并在溢出时返回。+=checked_add()false
2赞 Sven Marnach 10/18/2023
还要注意的是 函数,函数的最后一行应该是 simple(没有任何 或 )。log10()sum == checkifreturn

答: 暂无答案