在codewars中,有一个质因数分解题:
https://www.codewars.com/kata/primes-in-numbers/train/rust
比如,有一个数,86240,我们可以分解如下:
86240=2 x 2 x 2 x 2 x 2 x 5 x 7 x 7 x 11
请写一个输出如此格式:(2**5)(5)(7**2)(11)。
一、我的代码
fn prime_factors(n: i64) -> String {
// your code
if is_prime(n){return format_print(vec![n]);}
let mut m = n;
let mut output: Vec<i64> = Vec::new();
for i in 2..n + 1 {
if !is_prime(i) {
continue;
}
while m % i == 0i64 {
output.push(i);
m = m / i;
}
if m < i {
break;
}
}
println!("output:{:?}", output);
format_print(output)
}
fn is_prime(n: i64) -> bool {
match n<=1{
true =>return false,
_=>return !(2..n).any(|x| n % x == 0),
}
}
fn format_print(v: Vec<i64>) -> String {
let len = v.len();
let mut strs = "".to_string();
let mut repeat_n = 1;
for i in 0..len {
if i != 0 {
if &v[i] == &v[i - 1] {
repeat_n += 1;
} else {
match repeat_n {
1 => strs.push_str(&format!("({})", &v[i - 1])),
_ => strs.push_str(&format!("({}**{})", &v[i - 1], repeat_n)),
};
repeat_n = 1;
if i == len - 1 {
strs.push_str(&format!("({})", &v[i]));
}
}
}
}
strs
}
调试运行:
fn main() {
let st = SystemTime::now();
println!("7919=>{}", prime_factors(7919));
println!("1=>{}", prime_factors(862400));
println!("2=>{}", prime_factors(7775460));
println!("3=>{}", prime_factors(17 * 17 * 93 * 677));
let mt1 = SystemTime::now();
println!("is_fit_num time:{:?}", mt1.duration_since(st).unwrap());
thread::sleep_ms(500000);
}
结果输出以及用时:
7919=>(7919)
output:[2, 2, 2, 2, 2, 2, 5, 5, 7, 7, 11]
1=>(2**6)(5**2)(7**2)(11)
output:[2, 2, 3, 3, 3, 5, 7, 11, 11, 17]
2=>(2**2)(3**3)(5)(7)(11**2)(17)
output:[3, 17, 17, 31, 677]
3=>(3)(17**2)(31)(677)
is_fit_num time:Duration { secs: 0, nanos: 1003300 }
通过了相关测试,但由于codewars认为用时过长(要求在12秒以内运行结束),无法接受codewars的提交。接下来还需优化。
原因是,弄个大数,上面的程序就会挂(用时过长),比如:
println!("987654321 =>{}", prime_factors(987654321));//估计要40秒
二、其他精彩的解法
这个需等我过关了,才能知道…….