用于在求和中划分每个单独术语的公式

时间:2012-05-05 04:55:15

标签: c math complexity-theory

实施例: ![math]http://mathurl.com/83cpbet.png

当整体应用除法时,结果是,

http://mathurl.com/79p3hoh

求和公式由下式给出, summation

使用求和规则可以在O(1)中轻松计算上述内容。

但是当它单独应用于每个术语时(在商中小数点后截断), = 0 + 1 + 1 + 2 + 3 + 3 + 4 + 5 = 19。 [在C中使用正常int / int分区

上述方法需要O(N)作为求和规则不能应用。

据我所知,上述原因是由于精度的损失在分割应用于每个术语而不是最后一个术语时更多。但这是我所需要的。[在上面的例子中, 19是所需的解决方案而不是21]

是否有一个公式可以作为单独对每个术语应用除法的快捷方式,类似于求和?

6 个答案:

答案 0 :(得分:3)

所以,你得到:

0 +(1 + 1 + 2)+(3 + 3 + 4)+ 5

让我们乘以3:

0 +(3 + 3 + 6)+(9 + 9 + 12)+ 15

并将其与(1 + ... + 15)/ 3的分子进行比较:

1 +(3 + 5 + 7)+(9 + 11 + 13)+ 15

你可以清楚地看到,你所寻求的总和每3个项丢失3个分子,平均每个项丢失1个。我们如何将术语分组为三元组并不重要:

(0 + 3 + 3)+(6 + 9 + 9)+ 12 + 15
(1 + 3 + 5)+(7 + 9 + 11)+ 13 + 15

甚至

0 + 3 +(3 + 6 + 9)+(9 + 12 + 15)
1 + 3 +(5 + 7 + 9)+(11 + 13 + 15)

所以你的和* 3小于(1 + ... + 15)/ 3的分子大约是术语数。

分子可以使用算术级数之和的公式计算:n 2 ,其中n是总和中的术语数: / p>

1 + 3 + 5 + 7 + 9 + 11 + 13 + 15 = 2 8 = 64

现在你从64减去8,得到56并除以3得到18.6(6)。该数字不等于19,因为n(术语数)不是3的倍数。

因此,最终的公式并不完全是(n 2 - n)/ 3,但最多只能与正确值相差1。 / p>

事实上,它是:

(n * n-n + 1)/ 3向下舍入或使用整数除法计算。

将数字插入其中我们得到:

(8 * 8-8 + 1)/ 3 = 57/3 = 19

答案 1 :(得分:1)

简短回答:是的,有这样的公式。

答案很长(因为我猜你想要公式):

如何得到它:你已经意识到求和公式和int devision的总和之间的差异来自每个加数处的int除法的舍入。

创建一个包含行的表:

第一行,每个加数的结果,以全精度除法。

第二行,每个求和的重复,当你执行整数除法时。

第三排,两者的区别。

现在你应该意识到这种模式,它始终是1 / 3,0,2 / 3。

来自3的除法,你可以证明你是否需要正式(例如归纳)。

所以最后你的公式是:(n ^ 2)/ 3 - (n / 3)

n * n / 3是常规求和公式,并且对于所有完整的3个加法1丢失,我们减去n / 3。

答案 2 :(得分:1)

结果将是

1+1 + 2 + 3+3 + 4 + 5+5 + 6 + 7+7 + 8 + 9+9 + 10 + ...

换句话说,所有奇数出现两次,所有偶数出现一次。第一n个自然数的总和为n*(n+1)/2,因此第一个n偶数自然数的总和是两倍,而第一个n奇数之和则是{{1 }}

我认为你现在可以获得所需的所有结果......

答案 3 :(得分:1)

为了增加n s,您需要的总和是: 1,2,4,7,10,14,19,24,30,36 ......

将这些内容插入The On-Line Encyclopedia of Integer Sequences™ (OEIS™),您就可以获得符合要求的系列A007980。计算公式为a(n)= ceil((n + 1)*(n + 2)/ 3)。

这使得a(0)= 1,a(1)= 2,a(6)= 19,意味着索引偏移2:sum(1,8)= a(8-2)。

答案 4 :(得分:0)

Σ((2i+1)/3) where i =0 to n-1 and Σ((2i+1)/3) = n*n/3

答案 5 :(得分:0)

#include <stdio.h>

typedef struct fraction {
    int n;//numerator
    int d;//denominator
} Fraction;

int gcd(int x, int y){
    x = (x < 0)? -x : x;
    y = (y < 0)? -y : y;
    while(y){
        int wk;
        wk = x % y;
        x = y;
        y = wk;
    }

    return x;
}

Fraction rcd(Fraction x){
    int gcm;
    gcm = gcd(x.n, x.d);
    x.n /= gcm;
    x.d /= gcm;
    return x;
}

Fraction add(Fraction x, Fraction y){
    x.n = y.d*x.n + x.d*y.n;
    x.d = x.d*y.d;
    return rcd(x);
}

int main(void){
    Fraction sum = {0,1};
    int n;

    for(n=1;n<=8;++n){
        Fraction x = { 2*n-1, 3 };
        sum = add(sum, x);
    }
    printf("%d/%d=",sum.n,sum.d);
    printf("%d",sum.n/sum.d);

    return 0;
}