C ++和Python版本相同的算法给出了不同的结果

时间:2015-04-28 04:23:50

标签: python c++ algorithm python-3.x triangle-count

以下代码是一种算法,用于确定整数三角形的数量,其最大边小于或等于MAX,具有整数中位数。 Python版本可以工作,但对于较大的N来说太慢了,而C ++版本要快得多,但没有给出正确的结果。

当MAX为10时,C ++和Python都返回3.

当MAX为100时,Python返回835,C ++返回836。

当MAX为200时,Python返回4088,C ++返回4102。

当MAX为500时,Python返回32251,C ++返回32296。

当MAX为1000时,Python返回149869,C ++返回150002。

这是C ++版本:

else if (user.isNew()) {
                Log.w("FB","User signed up and logged in through Facebook!");
                //showUserDetailsActivity();
                getProfileInfo();
            }

这是原始的Python版本:

#include <cstdio>
#include <math.h>

const int MAX = 1000;

int main()
{
    long long int x = 0;
    for (int b = MAX; b > 4; b--)
    {
        printf("%lld\n", b);
        for (int a = b; a > 4; a -= 2){
            for (int c = floor(b/2); c < floor(MAX/2); c+=1)
            {
                if (a+b > 2*c){
                    int d = 2*(pow(a,2)+pow(b,2)-2*pow(c,2));
                    if (sqrt(d)/2==floor(sqrt(d)/2))
                        x+=1;
                }
            }
            }
    }
    printf("Done: ");       
    printf("%lld\n", x);
}

我对C ++不太熟悉,所以我不知道会发生什么导致这种情况(可能是溢出错误?)。

当然,对算法的任何优化都非常受欢迎!

2 个答案:

答案 0 :(得分:1)

问题是c(python中的C)变量的范围不匹配。要使它们等效于您现有的C ++范围,您可以将python循环更改为:

for C in range(int(math.floor(b/2)), int(math.floor(n/2))):
    ...

要使它们等效于您现有的python范围,您可以将C ++循环更改为:

for (int c = ceil(b/2.0); c < MAX/2 + 1; c++) {
    ...
}

根据最初正确的循环,这将使结果匹配。

答案 1 :(得分:-1)

接下来可能会遇到一些麻烦:

(sqrt(d)==floor(sqrt(d)))