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,10^7]。
输出格式:
在一行中输出被测函数运行的时间。运行时间必须按照 hh:mm:ss(即2位的 时:分:秒)格式输出;不足 1 秒的时间四舍五入到秒。
输入样例:
123 4577973
结尾无空行
输出样例:
12:42:59
结尾无空行
题目大概意思就是给我们两个数C1和C2(C1<C2),我们将它们输入后用C2-C1就是相差的时间值S,但这时单位还不是秒,每100才为1秒,所以将S除以100即可,再分别得出小时数hh,分钟数mm和秒数ss,对应代码如下:
ss=(int)S%60;
hh=S/3600;
mm=(int)S%3600/60;
需要注意的点:
一、将相差时间S换为以秒为单位时除以100后有小数,根据题目意思,不能舍去小数,所以S要设置为double类型
二、四舍五入的处理
我在S除以100后就将它四舍五入了(如果想放在将秒分离出来后处理也行),四舍五入的常用函数的格式为round(double x),返回值也为double型,需要对它进行取整,例如
#include<stdio.h>
#include<math.h>
int main(){
double a=round(3.40);
double b=round(3.50);
printf("%d,%d\n",(int)a,(int)b);//输出的结果是3,4
return 0;
}
别忘了加上#include<math.h>头文件才可以运行
三、printf输出格式设置
%0md可以使不足m位的int型变量以m位进行右对齐输出,高位用0补齐。
这里要求:运行时间必须按照 hh:mm:ss(即2位的 时:分:秒)格式输出,所以只需要设置为
printf("%02d:%02d:%02d",hh,mm,ss);
四、千万注意,如果输入的C1、C2设置为int类型,那么在进行运算S=((double)C2-(double)C1)/100;
这个时,要把C1、C2强制类型转换为double,否则即使S为double型,它得到的小数永远为0。
最后完整正确代码如下:
#include <iostream>
#include<math.h>
#include<stdio.h>
using namespace std;
int main()
{
long long int C1;
long long int C2;
int hh,mm;
int ss;
double S;
cin>>C1>>C2;
S=((double)C2-(double)C1)/100;
// printf("%.2f ", S);
S=round(S);
ss=(int)S%60;
hh=S/3600;
mm=(int)S%3600/60;
// ss=round(ss);
printf("%02d:%02d:%02d",hh,mm,ss);
return 0;
}
这次没有大佬文章链接啦,自己想的~查阅了算法笔记这本书。