2014-04-28 66 views
0

如何使用rust-0.10對此進行調試?它適用於較小的號碼,如13195 ... 我覺得我擊球中有單位的一些限制非法指令(核心轉儲)

use std::vec; 
use std::num; 
use std::iter; 

fn int_sqrt(n: uint) -> uint { 
    num::sqrt(n as f64) as uint 
} 

fn simple_sieve(limit: uint) -> ~[uint] { 
    if limit < 2 { 
     return ~[]; 
    } 

    let mut primes = vec::from_elem(limit + 1, true); 

    for prime in iter::range_inclusive(2, int_sqrt(limit) + 1) { 
     if primes[prime] { 
      for multiple in iter::range_step(prime * prime, limit + 1, prime) { 
       primes[multiple] = false 
      } 
     } 
    } 
    iter::range_inclusive(2, limit).filter(|&n| primes[n]).collect() 
} 
fn main() { 
    let limit: uint = 600851475143; 
    let limithalf: uint = limit/2 as uint; 
    let primes = simple_sieve(limithalf); 
    let sieved: ~[uint] = primes.move_iter().filter(|&n| limit % n == 0).collect(); 
    println!("{:?}", sieved); 
    let mut max = 0; 
    let f = |x: uint| if x > max { max = x }; 
    for x in sieved.iter() { 
     f(*x); 
    } 
    println!("{}", max); 
} 

回答

2

的問題是巨大的分配()你正在試圖做的:在vec::from_elem呼叫simple_sieve是試圖分配600851475143/2字節,即大約280 GB。該分配失敗(即,malloc返回NULL),該ATM僅導致Rust中止。

這個簡單的程序指示問題:

extern crate libc; 

fn main() { 
    let n = 600851475143/2; 
    let p = unsafe {libc::malloc(n as libc::size_t)}; 
    println!("alloc {}", p) 
} 

打印alloc 0x0我。嘗試使用較小的數字。 :)

+0

什麼一天。 10分鐘後的另一個答案。謝謝 – rofrol