Rust: codewars的primes-in-numbers

在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秒

二、其他精彩的解法

这个需等我过关了,才能知道…….

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值