求和的总和(1)+总和(2)+ .... +(n)

时间:2017-06-16 06:50:00

标签: c math

我正在寻找找到数字总和的解决方案。输入将被赋予n整数,问题是找到sum(1)+ sum(1 + 2)+ sum(1 + 2 + 3)+ ... + sum(1 + 2 +。 。+ N)。我需要使用动态编程或任何数学计算的非常优化的解决方案。

int main()
{
    int sum = 0;
    int i = 0, n = 6;

    for( i = 1; i < n; i++ )
        sum = sum + findSumN( i );

    printf( "%d",sum );
}

3 个答案:

答案 0 :(得分:4)

您通常可以通过计算前几个字词并使用搜索结果搜索On-Line Encyclopedia of Integer Sequences来找到这样的系列公式。

1 = 1
1 + (1+2) = 4
4 + (1+2+3) = 10
10 + (1+2+3+4) = 20
20 + (1+2+3+4+5) = 35
35 + (1+2+3+4+5+6) = 56

您尝试计算的序列(1,4,10,20,35,56,...)为A000292,其具有以下公式:

a(n) = n × (n + 1) × (n + 2) / 6

答案 1 :(得分:0)

查看sum(n)=1+2+…+n的封闭形式,查看Pascal的三角形标识。这立即提供了一种非常快速的计算方法。

作为

binom(k,2) + binom(k,3) = binom(k+1,3) 
binom(k,2) = binom(k+1,3) - binom(k,3) 

来自binom(k+1,2)的{​​{1}}的总和会产生总和值

k=M to N

答案 2 :(得分:0)

如果您使用该号码,您可以找到一些模式。从

开始

sum(1 + 2 + 3 ... + N) = ((1 + N) * N) /2

然后最大数字和上面的值之间存在关系,即每次最大数量增加1时,差异步长为1/3。所以得到:

(1 + ((1.0 / 3.0) * (max - 1)))

我在数学上不够好解释为什么会出现这种模式。也许有人可以用数学方式解释它。

以下是我的解决方案,不需要迭代。

int main()
{
    int min = 1;
    int max = 11254;
    double sum = ((min + max) * max / 2) * (1 + ((1.0 / 3.0) * (max - 1)));
    printf("%.f", sum);
}