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
}