51.和为n连续正数序列(数组)。
题目:输入一个正数n,输出所有和为n连续正数序列。
例如输入15,由于1+2+3+4+5=4+5+6=7+8=15,所以输出3个连续序列1-5、4-6和7-8。
分析:这是网易的一道面试题。
思路:这道题初看起来就是一个数学题。简单的方法就是采用遍历的方法,时间复杂度为O(n^2)。不过很显然,得到的结果数组为一个等差数列,因此等差数列的和可以用公式的来计算。这样就得到了。一个纯数学的问题。另外结果数列还是有些特点可循的。比如:数列的第一个元素肯定是<=输入的n的一半的,也就是说ai<=n/2。还有就是数组中元素的个数肯定是大于0的整数。这样就能将时间复杂度降到O(n)。
贴上代码:http://blog.youkuaiyun.com/zcsylj/article/details/7857380
#include <stdio.h>
#include <math.h>
int main()
{
int n;
int i=0;
int j=0;
int num=0;
double tmp=0;
scanf("%d",&n);
for(i=1;i<=n/2;i++)
{
num=(2*i-1)*(2*i-1)+8*n;
tmp=sqrt(1.0*num);
if(tmp!=(int)tmp)
continue;
num=(1-2*i+(int)tmp);
if(num%2==0&&num>0)
{
for(j=0;j<num/2;j++)
printf("%d ",i+j);
printf("\n");
}
}
return 0;
}