0

我的一切工作正常。代码-

#include <stdio.h>
#include <math.h>

int quadtest(unsigned long long int a, unsigned long long int b, unsigned long long int c,     unsigned int n)
{
    if ((pow(a,n)+pow(b,n))==pow(c,n))
        return 1;
    else
        return 0;
}

main()
{
unsigned long long int a;
unsigned long long int b;
unsigned long long int c;
unsigned int n;

n=3;
for(n; n<50; n++)
{

//printf("\nn=%u",n);
    for(c=2; c<500; c++)
    {

        printf("\ntrying now c=%llu and n=%u",c,n);     
        for(b=2; b<500; b++)
        {
            for(a=2; a<500; a++)
            {
                quadtest(a,b,c,n);
                if (quadtest(a,b,c,n)==1)
                {   
                    printf("\n|||||||||||||||||||||||WORKS|||||||||||||||||||||||||||||||||");
                    break;
                }
                //printf("\na=%llu, n=%u b=%llu c=%llu",a,n,b,c);   

            }
        if (quadtest(a,b,c,n)==1)
        break;}

        if (quadtest(a,b,c,n)==1)
        break;
    }
    if (quadtest(a,b,c,n)==1)
    break;
}       
if (quadtest(a,b,c,n)==1)
printf("\nthe correct values are a=%llu,b=%llu,c=%llu,n=%u",a,b,c,n);
else
printf("\nfermats theory is correct");
}

从我的立场来看,我正确地编写了所有代码(我只使用了 50 和 500 的范围,因此我可以在我的计算机上实际运行它而无需花费一天的时间)。

所以我在 Cygwin 中编译了程序(我需要使用它),大约花了 15 分钟左右,然后停在“正确的值是 a=381,b=2,c=381,n=7”,这很明显不正确。我不确定问题是什么或如何解决这个问题。我认为它与记忆有关,但我仍然不确定它的修复方法是什么。

4

2 回答 2

2

由于您正在处理双精度数(pow()返回双精度数),因此最好使用EPSILON如下方式比较它们。您创建一个“小”双精度数(例如double EPSILON = 0.001)并通过计算两个变量之间的差异与双精度数进行比较。

double a,b;
if(abs(a - b)) < EPSILON){
     /* your code here..
}

使用该abs()功能很重要,因此您不必担心(a > b) || (b < a)

为了获得更好的效果可以选择较小的EPSILON

写这个:

if ((pow(a, n) + pow(b, n) - pow(c, n)) < EPSILON) {
    return 1;
于 2013-03-10T22:39:11.863 回答
1

pow() 接受双参数并返回一个双精度值。double 的精度有限(通常使用 64 位)。存在一个双 x 使得 (x + 1.0) == x。这基本上就是您遇到的问题,因为 381**7 是一个非常大的整数。

要正确地进行这种计算,您需要一种对大整数进行精确数学运算的方法。您需要的通常称为“bignum”库。GMP就是这样一种,您可能想检查一下。

于 2013-03-10T22:17:09.310 回答