话不多说,直接上题:
题目:输入一个正数n,输出所有和为n 连续正数序列。
示例:
输入:
n=15
输出:
1-5
4-6
7-8
思路:
第一步:确定序列起始值和循环范围
如果有满足条件的结果,那么一定是从最小的正整数开始查找,即正数序列头start从1开始;当前正数序列尾end即从start+1开始,依次递增,每次递增后,计算累加和sum;直到start递增到目标正数n的向下取整的中位数,即n/2时,停止计算,返回结果;
第二步:根据累加和sum和目标正数n的大小分别处理
sum<n:序列尾end自增,并累加到sum
sum>n:sum移除当前序列头start,序列头start自增
sum=n:记录当前序列头start,序列尾end;此时sum移除当前序列头start,序列头start自增
边界:
n=1:返回序列1
n>1:计算连续正数序列
实现(C#):
public static List<string> FindContinuousSequence(int n) {
try
{
var result = new List<string>();
int start = 1, end = start + 1, mid = n / 2, sum = start + end;
if (n == 1) {
result.Add("1");
return result;
}
while (start <= mid)
{
if (sum < n)
{
end++;
sum += end;
}
else if (sum > n)
{
sum -= start;
start++;
}
else
{
string seq = $"{start}-{end}";
result.Add(seq);
sum -= start;
start++;
}
}
return result;
}
catch (Exception ex) {
Console.WriteLine("获取异常:", ex);
return null;
}
}
static void Main(string[] args){
Console.WriteLine("请输入正数n");
int n = Convert.ToInt32(Console.ReadLine());
var result = FindContinuousSequence(n);
if (result != null && result.Count > 0)
{
Console.WriteLine("和为n的连续正数序列为:");
foreach (var item in result)
Console.WriteLine(item);
}
}
验证:
分析:
时间复杂度:O(n)
空间复杂度:O(n)