首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在for循环中使用i<sqrt(n)和i*i<(n)哪个更有效?

在for循环中使用i<sqrt(n)和i*i<(n)哪个更有效?
EN

Stack Overflow用户
提问于 2020-03-26 14:55:10
回答 1查看 202关注 0票数 0

谁能帮我找出下面两个中哪一个更有效、更正确?

1.

代码语言:javascript
运行
复制
for(int i = num; i * i <= n; i++)

2.

代码语言:javascript
运行
复制
int root = sqrt(n);
for(int i = num; i <= root; i++)

在第一种方法中,我们计算每次循环运行时i的平方。另外,我们不能预先计算i的平方,因为我每次都会更新。

在第二种方法中,我们不是每次都计算sqrt(n)。这是节省时间吗?

即使是大数字(如10^6),第二个循环的速度是否会更快,结果是否100%准确?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-26 16:08:38

第二个场景应该更有效,因为循环中的每个迭代都不需要计算循环限制器。尝试使用下面给出的代码测量两种类型的for循环所用的CPU时间。看起来,对于第一种情况,像n=25这样的较小数字,cpu时间实际上更短。但是对于值n>=100,第二种情况提供了更少的cpu时间。

代码语言:javascript
运行
复制
    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);

输出:

代码语言:javascript
运行
复制
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 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60862264

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档