2015-01-15 66 views
0

我的目标是从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(因为载体不包括号码本身)和501502,我得到相同的号码。

PS:请不要试图让我的代码看起来更干净或提出了封闭形式的公式,因为我想用我的大脑裸露,现在需要一点帮助:)

+0

我可能会误解某些东西,但我得到了“你得到了回答!WOOT!”当我运行这个。这不意味着你的代码工作?你的例子说'864864000'不正确,但是* *正确吗? – Shepmaster

回答

3

做到这一点很可能,您的错误来自将一个非常大的整数转换为f32,然后进行比较(这会损失精度)。

+0

起飞f32时输出相同。 – Vikaton

+0

这工作!,我没有完全删除旧代码,FML ... – Vikaton

0

计算除数时,不能停在数字的平方根处。在最好的情况,你可以在n/i停在n为您计算的约数的号码,i最低除数大于1

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

可能这是来自矢量控制称为fac的因子,这表明它们是因子而不是因子。