Rust和为n的连续正数序列

Rust和为n的连续正数序列

题目:输入一个正数n,输出所有和为n 连续正数序列。
例如输入15,由于1+2+3+4+5=4+5+6=7+8=15,所以输出3 个连续序列1-5、4-6 和7-8。

fn main() {
    sum_is_n_continuous(15isize);
    println!("和为n 连续正数序列: {:?}", 1145);
}
//================================== 和为n的连续正数序列
// 和为n的连续正数序列 入口方法
// 构成队列然后循环开始查找
// n: isize 数值n
fn sum_is_n_continuous(n: isize){
    // 先将数值拆解成连续队列
    let mut data_list: Vec<isize> = Vec::new();
    for i in 1..n {
        data_list.push(i);
    }
    // 从0开始循环查找
    for j in 0..(n - 1) {
        let (s, e) = sum_with_start(j, n, &data_list);
        if s >= 0 && e > 0 { // 这里编译器要警告 好像是是没用的比较
            println!("找到 连续和为{:?} 的队列 {:?}", n, &data_list[s..e + 1]);
        }
    }
}
// 和为n的连续正数序列 根据给定队列 计算起点开始 和为sum的,起点和终点坐标
// s: isize 起点坐标
// sum: isezi 和值
// l: Vec<isize> 连续队列
// (usize, usize) 连续和是n的起始终结点角标
fn sum_with_start(s: isize, sum: isize, l: &Vec<isize>) -> (usize, usize){
    // 队列长度
    let _len: usize = l.len() as usize;
    // 当前计算和值
    let mut _sum: isize = 0;
    // 当前终点角标 索引值
    let mut _t_idx: usize = s as usize;
    while _t_idx < _len {// 只要索引值小于长度就继续循环
        let _n = l[_t_idx]; // 取得当前角标下队列值值
        _sum += _n;// 计算和
        if _sum < sum { // 检查和,小于就是要继续计算
            _t_idx += 1;//加角标
            continue;//继续
        } else if _sum == sum {//和等于,找到了,传送起点终点角标
            return (s as usize, _t_idx);
        } else if _sum > sum {//和大于,过了设置为00,离开
            return (0usize, 0usize);
        }
    }
    (0usize, 0usize)//保证每个地方都有返回。返回00
}

 

hmoban主题是根据ripro二开的主题,极致后台体验,无插件,集成会员系统
自学咖网 » Rust和为n的连续正数序列