我想要一个真正的快速算法或C中的代码来执行以下任务:对于任何给定的整数N,将所有数字从1加到N,而不假设N是正数。我做了一个从1到N的求和循环,但它太慢了。
答案 0 :(得分:30)
如果N
为肯定:int sum = N*(N+1)/2;
如果N
为否定:int tempN = -N; int sum = 1 + tempN*(tempN+1)/2 * (-1);
。
答案 1 :(得分:24)
sum = N * (N + 1) / 2
答案 2 :(得分:18)
您正在寻找的公式是在您的问题的多个答案中发布的公式的更一般形式,这是Arithmetic Series/Progression 差异 因子 1 。从Wikipedia起,它是以下内容:
只要 m 始终小于 n ,上述公式就会处理负数。例如,要将总和从1到-2,将 m 设置为-2,将 n 设置为1,即从-2到1之和。这样做会导致:
(1 - -2 + 1) * (1 + -2) / 2 = 4 * -1 / 2 = -4 / 2 = -2.
这是预期的结果。
答案 3 :(得分:5)
只是为了完成上述答案,这就是你如何证明公式(正整数的样本,但对于负数或任何算术套件的原理是相同的,如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)
答案 4 :(得分:1)
要处理整数溢出,我会使用以下函数:
sum = (N%2) ? ( ((N+1)/2)*N ) : ( (N/2)*(N+1) );
答案 5 :(得分:0)
试试这个......
其中n是您需要求和的最大整数。
总和是(n *(N + 1))/ 2
答案 6 :(得分:0)
int sum(int n) {
return (n < 0 ? n *(-n + 1) / 2 + 1 : n * ( n + 1) / 2);
}
答案 7 :(得分:0)
你听说过序列&amp;系列?你想要的“快速”代码是从1到N的算术系列之和... google it ..打开你的数学书..
答案 8 :(得分:0)
if | n |足够小,查找表将是最快的。
或使用缓存,首先搜索缓存,如果找不到记录,则使用n *(n + 1)/ 2(如果n为正)计算总和,并将结果记录到缓存中。