费马的最后定理算法

时间:2013-06-12 12:22:01

标签: c++ algorithm

我正在对费马的最后定理进行this定义。

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

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

}

这是一个输出屏幕: Image

怎么可能?我在C ++编程中遗漏了一些可能得到错误结果的“大整数”吗?

3 个答案:

答案 0 :(得分:13)

你的pow()函数溢出;请记住,int的尺寸有限。

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

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

根据标准,

unsigned int计算以模2提升到WIDTH的幂;即将永远环绕。

答案 1 :(得分:7)

  

我错过了什么

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

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

答案 2 :(得分:2)

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

要稍微减少问题,可以使用类型longunsigned long(64位平台上的64位)。如果使用long long,某些编译器也支持32位平台上的64位。

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