mirror of
https://github.com/RGBCube/uutils-coreutils
synced 2025-07-28 11:37:44 +00:00
add factor
This commit is contained in:
parent
79529d456f
commit
b321a1a5c0
3 changed files with 106 additions and 1 deletions
1
Makefile
1
Makefile
|
@ -14,6 +14,7 @@ PROGS := \
|
|||
echo \
|
||||
env \
|
||||
du \
|
||||
factor \
|
||||
false \
|
||||
fold \
|
||||
md5sum \
|
||||
|
|
|
@ -86,7 +86,6 @@ To do
|
|||
- expand (in progress)
|
||||
- expr
|
||||
- extent-scan
|
||||
- factor
|
||||
- find-mount-point
|
||||
- fmt
|
||||
- getlimits
|
||||
|
|
105
factor/factor.rs
Normal file
105
factor/factor.rs
Normal file
|
@ -0,0 +1,105 @@
|
|||
#![crate_id(name="factor", vers="1.0.0", author="T. Jameson Little")]
|
||||
#![feature(macro_rules)]
|
||||
|
||||
/*
|
||||
* This file is part of the uutils coreutils package.
|
||||
*
|
||||
* (c) T. Jameson Little <t.jameson.little@gmail.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE file
|
||||
* that was distributed with this source code.
|
||||
*/
|
||||
|
||||
extern crate getopts;
|
||||
extern crate libc;
|
||||
|
||||
use std::u64;
|
||||
use std::os;
|
||||
use std::vec::{Vec};
|
||||
use std::io::{stdin};
|
||||
|
||||
#[path="../common/util.rs"]
|
||||
mod util;
|
||||
|
||||
static VERSION: &'static str = "1.0.0";
|
||||
static NAME: &'static str = "factor";
|
||||
|
||||
fn factor(mut num: u64) -> Vec<u64> {
|
||||
let mut ret = Vec::new();
|
||||
|
||||
while num % 2 == 0 {
|
||||
num /= 2;
|
||||
ret.push(2);
|
||||
}
|
||||
let mut i = 3;
|
||||
while i * i <= num {
|
||||
while num % i == 0 {
|
||||
num /= i;
|
||||
ret.push(i);
|
||||
}
|
||||
i += 2;
|
||||
}
|
||||
if num > 1 {
|
||||
ret.push(num);
|
||||
}
|
||||
ret
|
||||
}
|
||||
|
||||
fn print_factors(num: u64) {
|
||||
print!("{}:", num);
|
||||
for fac in factor(num).iter() {
|
||||
print!(" {}", fac);
|
||||
}
|
||||
println!("");
|
||||
}
|
||||
|
||||
fn print_factors_str(num_str: &str) {
|
||||
let num = match u64::parse_bytes(num_str.as_bytes(), 10) {
|
||||
Some(x) => x,
|
||||
None => { crash!(1, "{} not a number", num_str); }
|
||||
};
|
||||
print_factors(num);
|
||||
}
|
||||
|
||||
|
||||
#[allow(dead_code)]
|
||||
fn main() { uumain(os::args()); }
|
||||
|
||||
pub fn uumain(args: Vec<String>) {
|
||||
let program = args.get(0).as_slice();
|
||||
let opts = [
|
||||
getopts::optflag("h", "help", "show this help message"),
|
||||
getopts::optflag("v", "version", "print the version and exit"),
|
||||
];
|
||||
|
||||
let matches = match getopts::getopts(args.tail(), opts) {
|
||||
Ok(m) => m,
|
||||
Err(f) => crash!(1, "Invalid options\n{}", f.to_err_msg())
|
||||
};
|
||||
|
||||
if matches.opt_present("help") {
|
||||
print!("{program} {version}\n\
|
||||
\n\
|
||||
Usage:\n\
|
||||
\t{program} [NUMBER]...\n\
|
||||
\t{program} [OPTION]\n\
|
||||
\n\
|
||||
{usage}", program = program, version = VERSION, usage = getopts::usage("Print the prime factors of the given number(s). \
|
||||
If none are specified, read from standard input.", opts));
|
||||
return;
|
||||
}
|
||||
if matches.opt_present("version") {
|
||||
println!("{} {}", program, VERSION);
|
||||
return;
|
||||
}
|
||||
|
||||
if matches.free.is_empty() {
|
||||
for line in stdin().lines() {
|
||||
print_factors_str(line.unwrap().as_slice().trim());
|
||||
}
|
||||
} else {
|
||||
for num_str in matches.free.iter() {
|
||||
print_factors_str(num_str.as_slice());
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue