2015-01-15 2 views
0

Моя цель состоит в том, чтобы найти первый треугольный номер с 500 делителями, от Project Euler. Это то, что я до сих пор:Скрытые ошибки в коде?

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 (так как вектор не включая номер) и 501 и 502, и я получаю тот же номер.

PS: пожалуйста, не пытайтесь сделать свой код смотреть очиститель или предложить замкнутую форму формулы, как я пытаюсь сделать это с моим голым мозгом, которая теперь нуждается в немного помочь :)

+0

Возможно, я что-то недопонимаю, но я получаю: «У ВАС ЕСТЬ ОТВЕТ!»! когда я запускаю это. Это не значит, что ваш код работал? В вашем примере указано, что '864864000' неверен, но что * правильно *? – Shepmaster

ответ

3

Скорее всего, ваши ошибки исходят из преобразования очень большого целого числа в f32, а затем сравнения (которое теряет точность)

+0

Тот же выход, когда снял f32. – Vikaton

+0

это сработало !, я не полностью удалял старый код, fml ... – Vikaton

0

При вычислении делителей вы не можете остановить квадратный корень из числа. В лучшем случае, вы могли бы остановиться на n/i где n это число вы рассчитываете делители и i самого низкий делителя больше 1.

Например, при подсчете делителей 12, вы бы только попробовать деление 1, 2 и 3, что даст вам число делителей 4 вместо шести, так как оно пропускает 4 и 6. Это приводит к тому, что вы обнаруживаете гораздо меньшее количество делителей, чем числа, которые действительно существуют.

Возможно, это происходит от вектора, содержащего делители, называемые fac, который предполагает, что они являются факторами вместо делителей.

Смежные вопросы