42 lines
1 KiB
Rust
42 lines
1 KiB
Rust
use std::fmt;
|
|
use std::str::FromStr;
|
|
|
|
#[derive(Debug, PartialEq)]
|
|
struct Complex {
|
|
real: i32,
|
|
imag: i32,
|
|
}
|
|
|
|
#[derive(Debug)]
|
|
struct InvalidComplex;
|
|
|
|
impl FromStr for Complex {
|
|
type Err = InvalidComplex;
|
|
|
|
fn from_str(input: &str) -> Result<Self, Self::Err> {
|
|
let parts: Vec<&str> = input.split('+').collect();
|
|
let real = parts[0].parse::<i32>().unwrap();
|
|
let imag = parts[1].trim_end_matches('i').parse::<i32>().unwrap();
|
|
|
|
Ok(Complex { real, imag })
|
|
}
|
|
}
|
|
|
|
impl fmt::Display for Complex {
|
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
|
write!(f, "{}+{}i", self.real, self.imag)
|
|
}
|
|
}
|
|
|
|
impl Solution {
|
|
pub fn complex_number_multiply(num1: String, num2: String) -> String {
|
|
let left: Complex = num1.parse().unwrap();
|
|
let right: Complex = num2.parse().unwrap();
|
|
|
|
(Complex {
|
|
real: left.real * right.real - left.imag * right.imag,
|
|
imag: left.real * right.imag + left.imag * right.real,
|
|
})
|
|
.to_string()
|
|
}
|
|
}
|