use std::io;
use std::mem::replace;
use std::time::Instant;
use num_bigint::BigUint;
use num_traits::{Zero, One};
fn get_nth_fibonacci_input() -> usize {
loop {
let mut nth_input_str = String::new();
println!("Enter nth fibonacci number:");
io::stdin()
.read_line(&mut nth_input_str)
.expect("Failed to read line");
match nth_input_str.trim().parse() {
Ok(input_number) => {
if input_number < 1 {
println!("The nth fibonacci number must be greater than 0.");
} else {
break input_number;
}
},
Err(_) => println!("Invalid nth fibonacci number: {}", nth_input_str)
}
}
}
fn main() {
let nth_fibonacci_input = get_nth_fibonacci_input();
let start = Instant::now();
let mut last: BigUint = Zero::zero();
let mut result: BigUint = One::one();
for _ in 1..nth_fibonacci_input {
let next_result = last + &result;
last = replace(&mut result, next_result);
}
let elapsed = start.elapsed();
println!("The fibonacci number is: {}", result);
println!("Calculation took: {} micro seconds", elapsed.as_micros());
}