我正在对费马的最后定理进行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";
}
这是一个输出屏幕:
怎么可能?我在C ++编程中遗漏了一些可能得到错误结果的“大整数”吗?
答案 0 :(得分:13)
你的pow()函数溢出;请记住,int
的尺寸有限。
例如,即使您使用无符号数据类型,pow(256,4)也会在32位溢出,64位溢出(256,8),即使您使用无符号数据类型。
技术上int
溢出未定义的行为因此,任何都可能发生,包括环绕(即回到0)或鼻子恶魔< / em>的
unsigned int
计算以模2提升到WIDTH的幂;即将永远环绕。
答案 1 :(得分:7)
我错过了什么
你是。实际上相当多。让我列举一下。
pow
的结果不是整数。int
的变量保证能够包含-32767到32767之间的数字。实际上,许多实现支持比这更多,例如-2147483648到2147483647.许多实现具有可以容纳更大数字范围的其他类型,例如, 0至18446744073709551616或有时至340282366920938463463374607431768211456或甚至至115792089237316195423570985008687907853269984665640564039457584007913129639936。(如果您可以在脑中采用100位数字的对数,您会注意到所有这些限制都是2的幂或接近的数字)。为了比较,以927的104中的功率是376957467458457979751155893254582133603833255821602148851832991547421266649046326838345134050350882042675908426098865621401193999321757163912667101283653576225503152314408933435079267041822928198211089834145222519701307017745008621307049171220994632585789166175212394809510781938945415209193278956111609706241。答案 2 :(得分:2)
int
值限制为32位(包括符号位),因此高值“换行”超出2147483647.C / C ++没有任意大值的内置数据类型。
要稍微减少问题,可以使用类型long
或unsigned long
(64位平台上的64位)。如果使用long long
,某些编译器也支持32位平台上的64位。
编辑:正如下面的评论所指出的,这些限制并不适用于所有C / C ++实现,但对于今天你会看到的大多数非嵌入式系统,这些都是你要去的限制。见。