我正在寻找找到数字总和的解决方案。输入将被赋予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 );
}
答案 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);
}