题目描述
要获得一个C语言程序的运行时间,常用的方法是调用头文件time.h,其中提供了clock()函数,可以捕捉从程序开始运行到clock()被调用时所耗费的时间。这个时间单位是clock tick,即“时钟打点”。同时还有一个常数CLK_TCK——给出了机器时钟每秒所走的时钟打点数。于是为了获得一个函数 f 的运行时间,只要在调用 f 之前先调用 clock(),获得一个时钟打点数C1;在 f 执行完成后再调用clock(),获得另一个时钟打点数C2;两次获得的时钟之差(C2-C1)就是 f 运行所消耗的时钟打点数,再除以常数CLK_TCK,就得到了以s为单位的运行时间。这里不妨简单假设常数CLK_TCK为100。现给定被测函数前后两次获得的时钟打点数,请给出被测函数运行的时间。
输入格式
在一行中顺序输入2个整数C1和C1。注意:两次获得的时钟打点数肯定不相同即C1<C2,并且取值在[0,]。
输出格式
在一行中输出被测函数运行的时间。运行时间必须按照"hh:mm:ss”(即2位的时:分:秒”)格式输出;不足1s的时间四舍五入到s。
(做法一)思路:
将打点数转化为总秒数,然后分别计算小时,分钟,秒数。
注意点:①转化为总秒数时,不要设置为int类型,不然后面小数会直接省掉,而题目要求四舍五入。
②调用math.h中的round(int x)进行四舍五入。
(做法一)代码实现:
#include<cstdio>
#include<cmath> //需要用“四舍五入”函数:double round(double x); int main()
{float c1,c2;scanf("%f%f",&c1,&c2);float a = (c2 - c1) / 100; //总秒数 //c1,c2为float类型,不能为int类型,否则“/100”,int直接将后面的小数去掉了,而题目要求四舍五入 int h,m,s; //时,分,秒 h = a / 3600;m = (a - h * 3600) / 60; s = round(a - h *3600 - m * 60); //round返回值是double类型,而s是int类型,进行了强制转换 printf("%02d:%02d:%02d\n",h,m,s);return 0;
}
(做法二)思路:
步骤1:先求出C2-C1,而由于1s等价于100CLK_TCK,因此换算成“s”单位时要将C2-C1除以100,又由于需要四舍五入,因此需要根据C2-C1的末两位来决定是四舍还是五入,其中当C2-C1的末两位不小于50时,说明C2-C1除以100后需要进位。
为了Step 2讲述方便,这里设ans为(C2-C1)/100四舍五入的结果。
步骤2:由于1h=3600s,因此 ans /3600即为小时数。于是,ans % 3600是去除小时数后剩余的部分,这个部分除以60即为分钟数,模上60即为秒数。
(做法二)代码实现:
#include<cstdio>int main()
{int c1,c2;scanf("%d%d",&c1,&c2);int ans = c2 - c1; //ans这里表示打点总次数 if(ans % 100 >= 50) //四舍五入 {ans = ans / 100 + 1; //这里ans表示“五入”后的总秒数 } else{ans = ans / 100; //这里ans表示“四舍”后的总秒数 }printf("%02d:%02d:%02d\n", ans / 3600, ans % 3600 / 60, ans %60 );return 0;
}
附加:
程序运行时间:clock()函数的使用
#include<cstdio>
#include<time.h>int main()
{int n1 = clock();int c1,c2;scanf("%d%d",&c1,&c2);int ans = c2 - c1; //ans这里表示打点总次数 if(ans % 100 >= 50) //四舍五入 {ans = ans / 100 + 1; //这里ans表示“五入”后的总秒数 } else{ans = ans / 100; //这里ans表示“四舍”后的总秒数 }printf("%02d:%02d:%02d\n", ans / 3600, ans % 3600 / 60, ans %60 );int n2 = clock();printf("%d",(n2-n1)/CLK_TCK);return 0;
}
结果:
第3行的9就是我此次运行程序的时间。