Ce face i32::isqrt
n.isqrt() returnează partea întreagă a rădăcinii pătrate, calculată exact, fără să treacă prin f64. Pentru numere mari (i64, u64), varianta prin (n as f64).sqrt() as i64 poate greși cu o unitate din cauza rotunjirii; isqrt nu.
Pentru un număr negativ, isqrt intră în panică, pentru că rădăcina nu există. checked_isqrt returnează None în acest caz. Tipurile fără semn (u32, u64) au doar isqrt, fără risc.
Ce returnează
i32 (checked_isqrt: Option<i32>).
Exemple
Exemplul 1: Rădăcini întregi și pătrate perfecte
fn main() {
for n in [0_i32, 1, 15, 16, 17, 99, 100] {
let r = n.isqrt();
let perfect = r * r == n;
println!("isqrt({n:>3}) = {r:>2} pătrat perfect: {perfect}");
}
println!("checked_isqrt(-4) = {:?}", (-4_i32).checked_isqrt());
}
Rezultat
isqrt( 0) = 0 pătrat perfect: true
isqrt( 1) = 1 pătrat perfect: true
isqrt( 15) = 3 pătrat perfect: false
isqrt( 16) = 4 pătrat perfect: true
isqrt( 17) = 4 pătrat perfect: false
isqrt( 99) = 9 pătrat perfect: false
isqrt(100) = 10 pătrat perfect: true
checked_isqrt(-4) = None
Exemplul 2: Test de număr prim
Ajunge să încercăm împărțitorii până la rădăcina pătrată a numărului.
fn este_prim(n: i32) -> bool {
n >= 2 && (2..=n.isqrt()).all(|d| n % d != 0)
}
fn main() {
let prime: Vec<i32> = (1..=50).filter(|&n| este_prim(n)).collect();
println!("{prime:?}");
println!("2026 este prim: {}", este_prim(2026));
println!("2027 este prim: {}", este_prim(2027));
}
Rezultat
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47]
2026 este prim: false
2027 este prim: true
Greșeli frecvente
- Apelezi
isqrtpe un număr care poate fi negativ: panică. Foloseștechecked_isqrt. - Folosești
(n as f64).sqrt() as u64pentru numere foarte mari: rezultatul poate fi greșit cu 1.