费马的最后定理算法

Fra*_*zzi 7 c++ algorithm

我是在这个费尔马大定理的定义.

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

#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";

}
Run Code Online (Sandbox Code Playgroud)

这是一个输出屏幕: 图片

怎么可能?我在C++编程中遗漏了一些可能导致错误结果的"大整数"吗?

Bat*_*eba 13

你的pow()函数溢出; 记住int一个有限的大小.

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

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

unsigned int根据标准,计算模2以WIDTH的功率增加; 即将永远环绕.

  • 他可能会在这里使用浮动调用[std :: pow](http://en.cppreference.com/w/cpp/numeric/math/pow).这仍然使它溢出,但溢出的性质更加复杂. (3认同)
  • 是不是只有UB的*signed*整数? (3认同)

n. *_* m. 7

我错过了什么

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

  1. 类型.并非C++中的所有数字都是整数.特别是,结果pow不是整数.
  2. 精度.那些非整数的类型在C++中的精度有限.在数学中,1和1.0000000000000000000000000000000000000000000000000000982是不同的数字.在你的C++程序中,祝你好运.
  3. 限制.C++中的整数和非整数都限制在它们可以假定的值范围内.类型的变量int保证能够包含在-32767到32767之间的数字.其实支持比相当多的许多实现,说-2147483648到2147483647许多实现有其他类型,可容纳更多数量的范围,例如0到18446744073709551616或有时340282366920938463463374607431768211456甚至115792089237316195423570985008687907853269984665640564039457584007913129639936.(如果你可以采取对数你头脑中有100位数的数字,你会注意到所有这些限制都是2的幂或接近它的东西.为了比较,