2015-01-15 86 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的因子,這表明它們是因子而不是因子。