zoukankan      html  css  js  c++  java
  • 和为n连续正数序列

    题目描述:

    输入一个正数n,输出所有和为n连续正数序列。

    例如输入15,由于1+2+3+4+5=4+5+6=7+8=15,所以输出3个连续序列1-54-67-8

    分析:

    来源于互联网 以下仅给出思路

    解法一:两个for循环解决,复杂度O(n2)

    解法二:

    因为整数序列有序,可以设立两个游标satrt,end,通过判区间[start,end]的和是否为n来得到这个序列。如果区间和大于n,start往前移动,如果小于n,end往前移动,等于就输出这个区间。时间复杂度是0(n).

    解法三:

    假设 start + (start + 1) + ... + end = n 是一个答案,则根据求和公式就是 (start + end) * (end - start + 1) / 2 = n, 则 (start + end)和 (end -start + 1)分别是2n的一个因子,枚举其中一个,就可以判断求出第二个,然后求出start和end了。时间复杂度是O(sqrt(n)).2n的因子范围肯定在[2,sqrt(2n)]之间。

    具体步骤:假设(end - start + 1)是其中一个因子,可以通过2n%i == 0找到一个因子i,令i = end - start + 1 则start + end = 2 * start + i - 1 然后根据上面的(start + end)*(end - start + 1)/2 = n的公式可以推导出 2*start*i = 2n - i^2 + i, 因此只要判断start存在正整数解,就可以知道满足上面条件的2n的另一个因子也是存在的。

  • 相关阅读:
    HTML总结
    js五角星评分特效
    正则表达式
    C#文件路径的写法
    vs2010发布网站
    INI文件阅读器
    .net读取xml文件中文乱码问题解决办法
    js利用定时器动态改变层大小
    c#中ref和out的用法
    分享一篇关于C#对文件操作的日志,方法很全
  • 原文地址:https://www.cnblogs.com/biyeymyhjob/p/2688730.html
Copyright © 2011-2022 走看看