62 lines
1.6 KiB
Rust
62 lines
1.6 KiB
Rust
pub struct Solution;
|
|
|
|
impl Solution {
|
|
pub fn fraction_to_decimal(numerator: i32, denominator: i32) -> String {
|
|
if numerator == 0 {
|
|
return "0".to_string();
|
|
}
|
|
|
|
let mut result = String::new();
|
|
|
|
if numerator.is_negative() != denominator.is_negative() {
|
|
result.push('-');
|
|
}
|
|
let mut numerator = numerator.unsigned_abs() as u64;
|
|
let mut denominator = denominator.unsigned_abs() as u64;
|
|
|
|
let gcd = Solution::gcd(numerator, denominator);
|
|
numerator /= gcd;
|
|
denominator /= gcd;
|
|
|
|
result.push_str(&(numerator / denominator).to_string());
|
|
if numerator % denominator == 0 {
|
|
return result;
|
|
}
|
|
|
|
result.push('.');
|
|
|
|
let mut remains = std::collections::HashMap::<u64, usize>::new();
|
|
loop {
|
|
remains.insert(numerator % denominator, result.len());
|
|
numerator %= denominator;
|
|
numerator *= 10;
|
|
result.push(((numerator / denominator) as u8 + '0' as u8) as char);
|
|
|
|
if result.len() >= 10000 {
|
|
break;
|
|
}
|
|
|
|
let remain = numerator % denominator;
|
|
if remain == 0 {
|
|
break;
|
|
} else if let Some(index) = remains.get(&remain) {
|
|
result.insert(*index, '(');
|
|
result.push(')');
|
|
break;
|
|
}
|
|
}
|
|
|
|
result
|
|
}
|
|
|
|
fn gcd(a: u64, b: u64) -> u64 {
|
|
if a == 0 {
|
|
b
|
|
} else if a <= b {
|
|
Solution::gcd(b % a, a)
|
|
} else {
|
|
Solution::gcd(b, a)
|
|
}
|
|
}
|
|
}
|