使用命令行传参来计算最大公约数

最大公约数函数代码

fn gcd(mut n:u64, mut m:u64) -> u64 {

assert!(n != 0 && m != 0);

while m != 0 {

if m < n {

let t = m;

m = n;

n = t;

}

m = m % n;

}

n

}

获取命令行的代码

// 使用标准库中的FormStr引入当前作用域

use std::env;

use std::str::FromStr;

// 程序主函数

fn main() {

// 声明一个可变变量 并初始化为空的向量空间

let mut numbers = Vec::new();

// 使用for循环来处理命令行参数,并将变量arg指向每个参数并运行循环体

for arg in env::args().skip(1) {

// 使用 u64::from_str 来将命令行参数 arg 解析为一个无符号的64位整数。

// 类似java中的静态方法,该函数返回一个指明解析成功或者失败的Result值,

// Ok(v) 成功,v是解析的值

// Err(e) 失败,e 是失败的原因

// expect 用来检验是否成功

numbers.push(u64::from_str(&arg)

.expect("error parsing argument"));

}

// 判断 numbers 的个数是否为0

if numbers.len() == 0 {

// 是让用 eprintln!宏,将错误消息写入标准错误流中

eprintln!("Usage: gcd NUMBER ...");

std::process::exit(1);

}

// 设置 可变变量 d 为 gcd 函数最终计算结果的值

let mut d = numbers[0];

// 此处有部分所有权的概念,如不明白可先行执行程序,后面会有单独的章节来详细阐述 Rust 中所有权的概念

// 在 for 循环时,所有权停留在 numbers 上,而在此次循环中只是借用它的元素。

// &numbers[1...] 中的 & 运算符在向量中从第二位(1)开始,让 m 依次借出每个元素

// 使用 * 将 m 引用,产生它所引用的值,传递给gcd下一个 u64 参数,

// numbers 拥有此向量,当它超过作用域是,Rust便会自动释放它。

for m in &numbers[1..] {

d = gcd(d,*m);

}

println!("The greatest common divisor of {:?} is {} ",numbers,d);

}

使用Cargo进行测试

% cargo run 14 12

Compiling hello v0.1.0 (/Users/xxx/Object/xxxx/rust/rust_stu/hello)

Finished dev [unoptimized + debuginfo] target(s) in 1.24s

Running `target/debug/hello 14 12`

The greatest common divisor of [14, 12] is 2

结果正确返回,参数被正常接受。

推荐阅读

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。