非法指令(核心倾销)

时间:2014-04-28 10:25:59

标签: rust

如何使用rust-0.10进行调试?它适用于较小的数字,如13195 ...... 我想我用uint

达到了一些限制
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);
}

1 个答案:

答案 0 :(得分: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。尝试使用较小的数字。 :)

相关问题