使用命令行传参来计算最大公约数
最大公约数函数代码
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
结果正确返回,参数被正常接受。
推荐阅读
发表评论