我目前正在使用Project Euler,这是我在问题3中的尝试(在Python中)。我跑了这个并让它持续了大约30分钟。在此之后,我查看了" sum"下的数字。我发现了几个问题:其中一些数字是偶数,因而不是素数,其中一些数字甚至不是n的正确因子。当然,他们只有0.000001(通常除以x.99999230984或其他)。我最终停在的号码是3145819243.0。
有谁可以解释为什么会出现这些错误?
编辑:我对该定理的解释基本上是,通过重新排列变量,你可以用n + y ^ 2的平方根求解x,并且y将被强制执行直到它是一个整数。在此之后,实际的素数因子将是x + y。这是我的代码。
extension=php_gd2.dll
答案 0 :(得分:4)
大数和浮点精度的典型问题。
当您到达y = 323734167
时,您计算的math.sqrt(n + y**2)
为math.sqrt(104804411734659032)
。
根据wolfram alpha,这是3.23735095000000010811308548429078847808587868214170702... × 10^8
,即不是整数,而是323735095.0
根据python。
如您所见,python没有精确度来查看.00000001...
。
您可以测试结果的平方:
,而不是测试is_integer
> 323735095 ** 2
=> 104804411734659025
并查看它是否与输入匹配(输入为104804411734659032
,输出为FOREACH p IN PackageManager.FindPackagesForUserWithPackageTypes(null,
PackageType_Main|PackageType_Optional)
{
PACKAGE_INFO_REFERENCE pir
OpenPackageInfoByFullName(p.Id.FullName, 0, &pir)
UINT32 n=0
GetPackageApplicationIds(pir, &n, null, null)
BYTE* buffer = new BYTE[n]
UINT32 count=0
GetPackageApplicationIds(pir, &n, buffer, &count)
ClosePackageInfo(pir)
PCWSTR * applicationUserModelIds = reinterpret_cast<PCWSTR*>(buffer);
FOR (i=0; i<count; ++i)
{
PCWSTR applicationUserModelId = applicationUserModelIds[i]
}
delete [] buffer
}
,关闭7)。