int if_no_prime(int n)
{
int prime, no_of_denominators=0;
for (int i=1;i<=n;i++)
{
if (n%i == 0)
no_of_denominators++;
}
if (no_of_denominators == 2)
prime=1;
else
prime=0;
return prime;
}
int main()
{
clock_t begin = clock();
int beginning, end, i, prime1, prime2;
printf("Enter the interval: ");
scanf(" %d %d", &beginning, &end);
for (i=beginning; i<=end; i++)
{
//here
prime1=if_no_prime(i);
if (prime1)
{
prime2=if_no_prime(i+2);
if (prime1 && prime2)
printf("The numbers %d and %d are twins\n", i, i+2);
}
}
clock_t end=clock();
double time_spent=(double)(end-begin);
printf("Compile time: %f", (double)time_spent);
return 0;
}
这段代码有效,但我想让它更快。当我i
直接插入测试时,我的编译时间是3010。不管那个数字是什么意思。但是如果我i
通过“这里”行上的另一个变量插入,我的编译时间是 2431。
有人可以向我解释为什么如果我直接插入值会变慢,以及在 c 中计时是如何工作的?
正如我评论的那样:
你误会了编译和运行时间。编译器是将 C 代码转换为目标代码(在运行程序之前完成)所需的时间。运行时间是程序执行所需的时间(在这种情况下,它适用于执行算法所需的时间)。
此外,您在要求用户输入之前启动了时钟,因此您测量的时间是:用户输入字符所花费的时间 + 实际算法的时间。
最后一件事,不要clock()
用于测量需要精度的时间。我为您提供了一个通用的实现,它以微秒为单位为您提供时间。
time.h 的clock()
函数返回一个结构clock_t
,其中包含自您开始执行以来已滴答的当前处理器时钟数。
将其除以常数 CLOCKS_PER_SEC(通常为 1000),您将得到经过的秒数。
在这里,您的代码可以工作并得到改进。它更清晰,更快速。
#include <stdio.h>
#include <sys/time.h>
double microsecs() {
struct timeval t;
if (gettimeofday(&t, NULL) < 0 ) return 0.0;
return (t.tv_usec + t.tv_sec * 1000000.0);
}
int if_no_prime(int n) {
int no_of_denominators=0;
for (int i = 1; i <= n; i++)
if (n%i==0) no_of_denominators++;
return (no_of_denominators == 2);
}
int main() {
int beginning, end, i, prime1, prime2;
printf("Enter the interval: ");
scanf(" %d %d", &beginning, &end);
double begin=microsecs();
for(i = beginning; i <= end; i++) {
//here
prime1=if_no_prime(i);
if(prime1) {
prime2 = if_no_prime(i+2);
if(prime1 && prime2) printf("The numbers %d and %d are twins\n", i, i+2);
}
}
printf("Execute time: %lf", microsecs()-begin);
return 0;
}
PD 因为我不明白什么是“插件”变量意味着我无法回答那部分。只要你澄清我,我就会编辑这个答案。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句