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.csdn.net/zcsylj/article/details/7857380
#include#include 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