【发布时间】:2020-03-26 06:55:09
【问题描述】:
谁能帮我看看以下两个哪个更有效更正确?
1.
for(int i = num; i * i <= n; i++)
2.
int root = sqrt(n);
for(int i = num; i <= root; i++)
在第一种方法中,我们在每次循环运行时计算 i 的平方。此外,我们无法预先计算 i 的平方,因为 i 每次都会更新。
在第二种方法中,我们不是每次都计算 sqrt(n)。这样可以节省时间吗?
即使对于大数字(如 10^6),第二个循环是否会更快地工作并获得 100% 准确的结果?
【问题讨论】:
-
乘法很便宜。但这确实需要基准测试,正如您所指出的,取决于
n -
*比sqrt快。对于某些数字,两者都不精确。 -
*对于 integers 是不精确的?这种循环常用于素数搜索 -
@Jean-FrançoisFabre:用词错误。整数无法处理大数字。浮点数会丢失具有大量数字的数字的精度。 Bigint 很慢,在 C 中需要一个库。选择你的毒药。
-
是的,我对 python 更习惯了。对于 C,使用整数是一个很大的烦恼。但是对于素数搜索,您不能做任何其他事情(
uint64_t有点帮助)。在某些时候,您将不得不使用一些大整数库。是的,它很慢。为什么你认为最大的已知素数只有 2**82,589,933-1(也是梅森素数)? :)
标签: c time-complexity c++14 square primality-test