Rust和为n的连续正数序列
< 返回列表时间: 2020-08-05来源:OSCHINA
题目:输入一个正数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 }
热门排行