7

我正在接受费马大定理的这个定义。

我试图编写一个算法来验证它的小值:

#include <iostream>
#include <cmath>
using namespace std;

int main() 
{
    //a^n + b^n = c^n

    int a, b, c, n, count = 0;

    for (n = 3; n < 1000; n++)
        for (a = 1; a < 1000; a++)
            for (b = 1; b < 100; b++)
                for (c = 1; c < 1000; c++)
                {
                    if (a != b && b != c && a != c)
                    {
                        if (pow(a,n) + pow(b,n) == pow(c,n))
                        {
                            cout << "\na: " << a << " b: " << b << " c: " << c << " n: " << n;
                            count++;
                        }
                    }
                }

    cout << count << " combinazioni";

}

这是一段输出的屏幕: 图片

怎么可能?我是否在 C++ 编程中遗漏了一些关于“大整数”的东西,可能会得到错误的结果?

4

3 回答 3

13

你的 pow() 函数溢出了;请记住 anint的大小有限。

例如, pow(256, 4) 将在 32 位上溢出, pow(256, 8) 在 64 位上溢出,即使您使用无符号数据类型也是如此。

从技术上讲,int溢出是未定义的行为,因此,任何事情都可能发生,包括环绕(即回到 0)或鼻恶魔

unsigned int根据标准,计算是模 2 提高到 WIDTH 的幂;即将始终环绕。

于 2013-06-12T12:29:04.120 回答
7

我错过了什么吗

你是。实际上相当多。让我一一列举。

  1. 类型。并非 C++ 中的所有数字都是整数。特别是, 的结果pow不是整数。
  2. 精密度。那些不是整数的类型在 C++ 中的精度有限。在数学中,1 和 1.000000000000000000000000000000000000000000000000982 是不同的数字。在你的 C++ 程序中,祝你好运。
  3. 限制。C++ 中的整数和非整数都限制在它们可以假设的值范围内。类型变量int保证能够保存 -32767 到 32767 之间的数字。Many implementations in fact support quite a bit more than that, say -2147483648 to 2147483647. Many implementations have other types that can hold larger ranges of numbers, eg 0 to 18446744073709551616 or sometimes to 340282366920938463463374607431768211456 or even to 115792089237316195423570985008687907853269984665640564039457584007913129639936. (If you can take logarithms在你脑海中的 100 位数字中,你会注意到所有这些限制都是 2 的幂或接近的幂)。为了比较,
于 2013-06-12T12:34:27.707 回答
2

int值限制为 32 位(包括符号位),因此高值“包装”超过 2147483647。C/C++ 没有用于任意大值的内置数据类型。

为了在一定程度上减少问题,您可以使用类型longunsigned long(在 64 位平台上为 64 位)。如果您使用long long.

编辑:正如下面评论中所指出的,这些限制并不同样适用于 C/C++ 的所有实现,但对于您今天将看到的大多数非嵌入式系统,这些是您将看到的限制。

于 2013-06-12T12:29:43.967 回答