最快的算法,可以将数字加总到N

我想在C中使用非常快的算法或代码来执行以下任务:对于任何给定的整数N,将所有数字从1加到N,而不假设N是正数。 我做了一个从1到N的求和循环,但它太慢了。

如果N为正: int sum = N*(N+1)/2;

如果N是负数: int tempN = -N; int sum = 1 + tempN*(tempN+1)/2 * (-1); int tempN = -N; int sum = 1 + tempN*(tempN+1)/2 * (-1);

 sum = N * (N + 1) / 2 

您正在寻找的公式是在您的问题的多个答案中发布的公式的更一般forms,这是一个差异系数为1的算术级数/级数 。 来自维基百科 ,它是以下内容:

替代文字

只要m总是小于n ,上述公式将处理负数。 例如,要将总和从1到-2,将m设置为-2,将n设置为1,即从-2到1之和。这样做会导致:

 (1 - -2 + 1) * (1 + -2) / 2 = 4 * -1 / 2 = -4 / 2 = -2. 

这是预期的结果。

只是为了完成上述答案,这就是你如何certificate公式(正整数的样本,但对于负数或任何算术套件的原理是相同的,如Void指出的那样)。

只需按如下所示编写套件两次并添加数字:

  1+ 2+ 3+ ... n-2+ n-1+ n = sum(1..n) : n terms from 1 to n + n+ n-1+ n-2+ ... 3+ 2+ 1 = sum(n..1) : the same n terms in reverse order -------------------------------- n+1+ n+1+ n+1+ ... n+1+ n+1+ n+1 = 2 * sum(1..n) : n times n+1 n * (n+1) / 2 = sum(1..n) 

为了处理整数溢出,我使用以下函数:

 sum = (N%2) ? ( ((N+1)/2)*N ) : ( (N/2)*(N+1) ); 

试试这个…

其中n是您需要求和的最大整数。

总和是(n *(N + 1))/ 2

int sum(int n) { return (n < 0 ? n *(-n + 1) / 2 + 1 : n * ( n + 1) / 2); }

你听说过序列和系列吗? 你想要的“快速”代码是从1到N的算术系列之和… google it .. infact打开你的数学书..

如果| n | 足够小,查找表将是最快的。

或者使用缓存,首先搜索缓存,如果找不到记录,则使用n *(n + 1)/ 2(如果n为正)计算总和,并将结果记录到缓存中。