[PAT B1026]程序运行时间
题目描述
1026 程序运行时间 (15 分)要获得一个 C 语言程序的运行时间,常用的方法是调用头文件 time.h,其中提供了 clock() 函数,可以捕捉从程序开始运行到 clock() 被调用时所耗费的时间。这个时间单位是 clock tick,即“时钟打点”。同时还有一个常数 CLK_TCK,给出了机器时钟每秒所走的时钟打点数。于是为了获得一个函数 f 的运行时间,我们只要在调用 f 之前先调用 clock(),获得一个时钟打点数 C1;在 f 执行完成后再调用 clock(),获得另一个时钟打点数 C2;两次获得的时钟打点数之差 (C2-C1) 就是 f 运行所消耗的时钟打点数,再除以常数 CLK_TCK,就得到了以秒为单位的运行时间。
这里不妨简单假设常数 CLK_TCK 为 100。现给定被测函数前后两次获得的时钟打点数,请你给出被测函数运行的时间。
输入格式
输入在一行中顺序给出 2 个整数 C1 和 C2。注意两次获得的时钟打点数肯定不相同,即 C1 < C2,并且取值在 [0,107]。
输出格式
在一行中输出被测函数运行的时间。运行时间必须按照 hh:mm:ss(即2位的 时:分:秒)格式输出;不足 1 秒的时间四舍五入到秒。
输入样例
123 4577973
输出样例
12:42:59
分析
- 这道题其实很简单,虽然题目很简单,但是我们要从题目中找到可以使用的技巧并在将来的难题中使用以便简化运算
- 以下是我第一次写的代码:(不是最终版,还需简化)
#include<iostream>
using namespace std;
const int CLK_TCK = 100; //定义时钟打点数
int main()
{
int c1, c2;
int hour = 0, minute = 0, second = 0; //表示小时数,分钟数,秒数
cin >> c1 >> c2;
second = (c2 - c1) / CLK_TCK + 2 * ((c2 - c1) % CLK_TCK) / CLK_TCK;//四舍五入计算总秒数
hour = second / 3600;
second -= hour * 3600;
minute = second / 60;
second -= minute * 60;
if (hour >= 10) cout << hour << ":";
else cout << "0" << hour << ":";
if (minute >= 10) cout << minute << ":";
else cout << "0" << minute << ":";
if (second >= 10) cout << second ;
else cout << "0" << second;
return 0;
}
3.写得很长,很不好,尤其令我头疼的是最后对输出的处理太繁琐了,这时我们就要想到使用printf的好处了,printf中可以使用%02d表示对齐,即两位对齐,之前填0
4.另外一个就是计算hour,minute,second的时候有些过于复杂了,还可以简化
#include<iostream>
using namespace std;
const int CLK_TCK = 100; //定义时钟打点数
int main()
{
int c1, c2;
int hour = 0, minute = 0, second = 0; //表示小时数,分钟数,秒数
cin >> c1 >> c2;
second = (c2 - c1) / CLK_TCK + 2 * ((c2 - c1) % CLK_TCK) / CLK_TCK;//四舍五入计算总秒数
hour = second / 3600;
minute = second % 3600 / 60;
second = second % 60;
printf("%02d:%02d:%02d", hour, minute, second);
return 0;
}
5.如果有对计算hour,minute,second不熟悉的,我自己的理解就是,
hour = second / 3600:先算出总秒数second,除以3600就相当于看有多少个3600,所以算出来就是hour
minute = second % 3600 / 60:second%3600取余就是说我一小时一小时地减,最后剩下的肯定就是不足一小时的那一个小时,那有多少分钟呢?自然是除以60
second = second % 60:同理,按照之前的理解,我一分钟一分钟(一分钟60秒)地减,减到最后就是不足一分钟的那一分钟,也就是对应的秒上填的内容