//51.和为n连续正数序列。
//题目:输入一个正数n,输出所有和为n连续正数序列。
//例如输入15,由于1+2+3+4+5=4+5+6=7+8=15,所以输出3个连续序列1-5、4-6和7-8。
//题目:输入一个正数n,输出所有和为n连续正数序列。
//例如输入15,由于1+2+3+4+5=4+5+6=7+8=15,所以输出3个连续序列1-5、4-6和7-8。
//分析:这是网易的一道面试题。
//这个题目出自微软等数据结构+算法面试100题
//在DevC++中编译通过
/*
Name:
Copyright:
Author:
Date: 23-06-11 15:27
Description:
*/
#include<iostream>
#include<iomanip>
using namespace std;
int main()
{
cout<<"n=";
int n;
cin>>n;
int *t;
if(!(t=(int *)malloc(sizeof(int)*(n/2+1))))
{
exit(0);
}
for(int i=0;i<(n/2+1);++i)
{
t[i]=i+1;
}
int sml,big;
int sum=t[0]+t[1];
for(sml=0,big=1;big<(n/2+1);)
{
if(sum==n)
{
for(int i=sml;i<=big;i++)
{
cout<<t[i]<<" ";
}
cout<<endl;
sum-=t[sml++];
sum+=t[++big];
}
else
{
if(sum<n)
{
sum+=t[++big];
}
else
{
sum-=t[sml++];
}
}
}
system("pause");
return 0;
}
分析:首先开辟一个数组,并对之初始化。这个算法做的事情是不断地调整sml 和 big ,sml指向小的数,big指示大的数,他们之间(包括边界)各个数的和为sum.