谁能帮我找出下面两个中哪一个更有效、更正确?
1.
for(int i = num; i * i <= n; i++)
2.
int root = sqrt(n);
for(int i = num; i <= root; i++)
在第一种方法中,我们计算每次循环运行时i的平方。另外,我们不能预先计算i的平方,因为我每次都会更新。
在第二种方法中,我们不是每次都计算sqrt(n)。这是节省时间吗?
即使是大数字(如10^6),第二个循环的速度是否会更快,结果是否100%准确?
发布于 2020-03-26 16:08:38
第二个场景应该更有效,因为循环中的每个迭代都不需要计算循环限制器。尝试使用下面给出的代码测量两种类型的for循环所用的CPU时间。看起来,对于第一种情况,像n=25这样的较小数字,cpu时间实际上更短。但是对于值n>=100,第二种情况提供了更少的cpu时间。
clock_t start,end;
double cpu_time_used;
double n, root;
n = atoi(argv[1]);
printf("n= %0f \n",n);
start = clock();
for (int i=0; i*i<n; i++);
end = clock();
cpu_time_used = ((double) (end-start)) / CLOCKS_PER_SEC;
printf("first iter: cpu_time_used: %f \n", cpu_time_used);
start = clock();
root = sqrt(n);
for (int i=0; i<=root; i++);
end = clock();
cpu_time_used = ((double) (end-start)) / CLOCKS_PER_SEC;
printf("second iter: cpu_time_used: %f \n", cpu_time_used);
输出:
n= 25.000000
first iter: cpu_time_used: 0.000004
second iter: cpu_time_used: 0.000011
n= 100.000000
first iter: cpu_time_used: 0.000002
second iter: cpu_time_used: 0.000001
n= 1000000.000000
first iter: cpu_time_used: 0.000011
second iter: cpu_time_used: 0.000008
https://stackoverflow.com/questions/60862264
复制相似问题