最快的算法,可以将数字加总到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为正)计算总和,并将结果记录到缓存中。