赞
踩
这里有一个通过欧几里得算法计算两个整数最大公约数的函数,首先我科普几个概念。
公约数,亦称“公因数”。它是一个能同时整除几个整数的数 [1]。如果一个整数同时是几个整数的约数,称这个整数为它们的“公约数”;公约数中最大的称为最大公约数。对任意的若干个正整数,1总是它们的公因数。公约数与公倍数相反,就是既是A的约数同时也是B的约数的数,12和15的公约数有1,3,最大公约数就是3。再举个例子,30和40,它们的公约数有1,2,5,10,最大公约数是10。
欧几里得算法又称辗转相除法,是指用于计算两个 非负整数 a,b的 最大公约数 。 应用领域 有数学和计算机两个方面。 计算公式 gcd (a,b) = gcd (b,a mod b)。 两个整数的最大公约数是能够同时整除它们的最大的正整数。 辗转相除法基于如下原理:两个整数的最大公约数等于其中较小的数和两数相除余数的最大公约数。
核心代码如下:
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
}
fn定义了一个函数,函数名是gcd,m和n是参数,u64表示无符号的64位整数。返回值也是一个无符号的64位整数。
这里mut是mutable的缩写,允许我们修改变量的值。
assert!表示一个宏调用,用于断言。
let声明一个局部变量。
最后只写了一个n,实际上相当于 return n; 需要注意的是,这里的n是不能带分号的,这样才会被认为是一个返回值。
有了上面的说明以后,我们创建一个项目实战一下。
cargo new hello
修改代码:
cd hello
vim src/main.rs
完整代码如下:
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 } fn main() { let r: u64 = gcd(88, 99); println!("{}", r); }
运行:
zhangdapeng@zhangdapeng:~/code/rust/hello$ cargo run
Compiling hello v0.1.0 (/home/zhangdapeng/code/rust/hello)
Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.91s
Running `target/debug/hello`
11
最后,清理一下:
zhangdapeng@zhangdapeng:~/code/rust/hello$ cargo clean
Removed 21 files, 7.4MiB total
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。