php专区

 首页 > php专区 > PHP进阶 > 算法 > 求和为指定数字的连续正整数数列

求和为指定数字的连续正整数数列

分享到:
【字体:
导读:
         摘要:对于这种算法的设计,我们最容易想到的就是从1到sn循环遍历所有的数,对于每个数再循环计算是否以这个数为起点总和正好是sn。这种算法的时间复杂度大概是O(n*log2n),也就是说如果这样计算,当sn100万时,大概需要循环2000万次左右。这样做效率自然是比较低的。那么我们有没有比上述方法更高效的方法呢?答案是肯定的。...

求和为指定数字的连续正整数数列

比如 sn = 100 时,总和为100 的连续正整数数列有

100
18 19 20 21 22
9 10 11 12 13 14 15 16

对于这种算法的设计,我们最容易想到的就是从 1 到 sn 循环遍历所有的数,对于每个数再循环计算是否以这个数为起点总和正好是sn。这种算法的时间复杂度大概是O(n*log2n), 也就是说如果这样计算,当 sn = 100万时,大概需要循环 2000万次左右。 这样做效率自然是比较低的。那么我们有没有比上述方法更高效的方法呢?答案是肯定的。

首先我们看等差数列求和的公式:Sn=n(a1+an)/2=na1+n(n-1)/2

从这个公式我们不难看出当 Sn 和 n 固定时求a1 是一个线性函数:a1 = (Sn – n(n-1)/2) / n

有了这个函数,优化这个算法就很简单了,我们只要把 n 从 1 开始遍历,一直遍历到 (Sn – n(n-1)/2)

题目:在1~500这500个整数中,找出连续相加等于500的数?

简要分析:int[] X={1,2,i,…………499}

条件是:i+(i+1)+ ……+(i+k)=500 (1式)

运用等差数列求和公式:(k+1)*i+(k+1)*k/2=500 (2式)

其中i和k还有一个隐藏关系i*k<500 (3式)

于是很自然得到如下解法:

	private static void GetSomeInt(int maxInt)
      {
          for (int i = 1; i 
  
  	

得出结果:

xi=8;9;10;11;12;13;14;15;16;17;18;19;20;21;22;23;24;25;26;27;28;29;30;31;32
xi=59;60;61;62;63;64;65;66
xi=98;99;100;101;102

这个算法 sn = 100 万时,循环次数是 12970034 次,比之前说的算法效率上要低将近1万倍。

下面给出差点的算法代码

       static void ListSequence(int sn)
        {
            //忽略 sn 不是正整数的情况
            if (sn = n) //当m 												

本文地址:http://www.nowamagic.net/librarys/veda/detail/1042,欢迎访问原出处。

求和为指定数字的连续正整数数列
分享到:
矩阵逆时针旋转的算法
矩阵逆时针旋转的算法 旋转矩阵(Rotation matrix)是在乘以一个向量的时候有改变向量的方向但不改变大小的效果的矩阵。旋转矩阵不包括反演,它可以把右手坐标系改变成左手坐标系或反之。所有旋转加上反演形成了正交矩阵的集合。旋转可分为主动旋转与被动旋转。主动旋转是指将向量逆时针围绕旋转轴所做出的旋转。...
如何判定一个数是否为2的N次方
如何判定一个数是否为2的N次方 题目:给定一个整数num,判断这个整数是否是2的N次方。比如,2,4,8是2的那次方,6,10不是2的N次方。 请看下面的程序: public static bool Check1(int num) { int i = 1; while (true) { if (i > num) return false; if (i...
  •         php迷,一个php技术的分享社区,专属您自己的技术摘抄本、收藏夹。
  • 在这里……