【发布时间】:2013-03-10 22:11:58
【问题描述】:
我的一切工作正常。 代码-
#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”这显然是不正确的。我不确定问题是什么或如何解决这个问题。我认为它与内存有关,但我仍然不确定它的修复方法是什么。
【问题讨论】:
-
这就是我的想法,我不确定我的范围是什么来解决这个问题。我正在考虑将 b
-
@Alex 问题是
pow()对不精确的浮点数进行操作。使用重复乘法实现您自己的幂函数,它会起作用。 -
@Alex 使用
unsigned long long,除了浮点值精度有限的问题之外,您很快就会溢出。如果你想运行正确的蛮力,你需要 bignums。
标签: c memory cygwin nested-loops