代码中的隐藏逻辑错误?

时间:2015-01-15 03:49:10

标签: rust

我的目标是从Project Euler找到第一个带有500个除数的三角形数字。这就是我到目前为止所做的:

use std::num::Float;

fn main() {
    let mut num = vec!(1 , 3 , 6 , 10);
    let mut a = 0us;
    let mut fac = vec![];
    for _ in (0us..1000000us) {
        let x =
            num[num.len() - 1] - num[num.len() - 2] + 1 +
                num[num.len() -
                        1]; //extremely clever way of listing triangle numbers(not to be cocky :))
        num.push(x);
    }
    println!("{:?}" , num);
    println!("Calculating...");
    let mut _i = 1is;
    for _ in (0us..num.len() as usize) {
        for _ in (1us..(num[a] as f64).sqrt() as usize) {                                        //Logic Error
            if num[a] % _i == 0 { fac.push(_i); }
            //print!("{},\n" , res.len()); }
            _i += 1;
        }
        fac.push(num[a] as isize,);
        if fac.len() >= 10 {println!("Length: {}\nVector: {:?}\nValue: {}\n\nYOU GOT THE ANSWER! WOOT! \x07", fac.len(), fac, num[a]); break;}
        _i = 1;
        fac = vec![];
        a+=1
    }
}

但这打印'864864000'作为不正确的值,这对我来说没有意义,我尝试过499(因为向量不包含数字本身)和{{ 1}}和501我得到的号码相同。

P.S:请不要试图让我的代码看起来更干净或提出封闭形式公式,因为我正试图用我的大脑做这个,现在需要一些帮助:)

2 个答案:

答案 0 :(得分:3)

最有可能的是,你的错误来自于将一个非常大的整数转换为f32然后进行比较(这会失去准确性)

答案 1 :(得分:0)

计算除数时,不能停在数字的平方根处。最好的情况是,您可以在n/i停留,其中n是您计算除数的数字,i是最大除数大于1。

例如,当计算12的除数时,你只会尝试除以1,2和3,这会给你一个除数为4而不是6,因为它错过了4和6.这会导致你找到比实际数字少得多的除数。

这可能来自于将除数称为fac的向量,这表明它们是因子而不是除数。