Add primes program
parent
6102d6ea7b
commit
598fd83190
@ -0,0 +1,4 @@
|
||||
/target
|
||||
**/*.rs.bk
|
||||
primes.txt
|
||||
*.tar.gz
|
@ -0,0 +1,35 @@
|
||||
# This file is automatically @generated by Cargo.
|
||||
# It is not intended for manual editing.
|
||||
[[package]]
|
||||
name = "hermit-abi"
|
||||
version = "0.1.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "libc"
|
||||
version = "0.2.66"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "num_cpus"
|
||||
version = "1.12.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"hermit-abi 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "primes"
|
||||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"num_cpus 1.12.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[metadata]
|
||||
"checksum hermit-abi 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "eff2656d88f158ce120947499e971d743c05dbcbed62e5bd2f38f1698bbc3772"
|
||||
"checksum libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)" = "d515b1f41455adea1313a4a2ac8a8a477634fbae63cc6100e3aebb207ce61558"
|
||||
"checksum num_cpus 1.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "46203554f085ff89c235cd12f7075f3233af9b11ed7c9e16dfe2560d03313ce6"
|
@ -0,0 +1,10 @@
|
||||
[package]
|
||||
name = "primes"
|
||||
version = "0.1.0"
|
||||
authors = ["trivernis <trivernis@gmail.com>"]
|
||||
edition = "2018"
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
||||
[dependencies]
|
||||
num_cpus = "1.0"
|
@ -0,0 +1,61 @@
|
||||
extern crate num_cpus;
|
||||
use std::thread;
|
||||
use std::fs::{OpenOptions};
|
||||
use std::io::prelude::*;
|
||||
use std::sync::mpsc::{sync_channel, SyncSender};
|
||||
use std::env;
|
||||
|
||||
fn main() {
|
||||
let (tx, rx) = sync_channel::<u64>(0);
|
||||
let num_threads: u64 = num_cpus::get() as u64;
|
||||
let mut start: u64 = 1;
|
||||
let args: Vec<String> = env::args().collect();
|
||||
if args.len() > 1 {
|
||||
start = *(&args[1].parse::<u64>().unwrap());
|
||||
}
|
||||
if &start % 2 == 0 {
|
||||
start += 1;
|
||||
}
|
||||
let mut file = OpenOptions::new()
|
||||
.write(true)
|
||||
.append(true)
|
||||
.create(true)
|
||||
.open("primes.txt")
|
||||
.unwrap();
|
||||
println!("Starting {} threads", num_threads);
|
||||
for i in 0u64..num_threads {
|
||||
let tx = tx.clone();
|
||||
let _child = thread::spawn(move || {
|
||||
get_primes(&start + (2*&i), &num_threads * 2, &tx);
|
||||
});
|
||||
}
|
||||
loop {
|
||||
let prime = rx.recv().unwrap();
|
||||
println!("{}", prime);
|
||||
if let Err(e) = writeln!(file, "{}", prime) {
|
||||
panic!(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn get_primes(start: u64, incr: u64, tx: &SyncSender<u64>) {
|
||||
let mut num = start;
|
||||
loop {
|
||||
let mut is_prime = true;
|
||||
if (num < 3) | (&num % 2 == 0) {
|
||||
num += incr;
|
||||
continue;
|
||||
}
|
||||
for i in (3u64..&num/2).step_by(2) {
|
||||
if &num % i == 0 {
|
||||
is_prime = false;
|
||||
}
|
||||
}
|
||||
if is_prime {
|
||||
if let Err(e) = (*tx).send(num) {
|
||||
panic!(e);
|
||||
}
|
||||
}
|
||||
num += incr;
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue