100-51

本文介绍了一种算法,用于找出所有连续正数序列的和等于给定正数n的方法。通过数学分析和等差数列公式,将时间复杂度从O(n^2)降低到O(n),并给出了C语言实现的示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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;
}

转载于:https://my.oschina.net/dapengking/blog/93400

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值