写在之前的一些废话:
目前一共进行了三次内部竞赛,第一次是最简单的,最难的个人感觉是第二次,第三次难题也有,个人感觉比较中规中矩。
第一次做解题报告,挑的是一个月前的一次内部竞赛,题目都是偏简单的,完成率也很高。
这次解题报告也不会提及太多技术上的问题(因为都是水题,没什么好提的),主要是想尝试一下整个解题报告的格式和模版,初步都是按照校队的报告形式依样画葫芦。
正文:
10.12 22大数据c语言自测1,题目均来自于TZOJ。
签到题:水中浸物问题,大象喝水,视频存储容量,分数乘法,对齐输出。
中等题:程序运行时间,BMP文件格式存储容量,近似值之四舍五入,合并正整数,Vaild Set,时间戳简化版。
从中等题开始。签到题如果不会的话,不应该。
TZOJ 5033 程序运行时间
描述
要获得一个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
这道题最初是一道PAT乙级的题目
其实题目说了很多,就是一道简单的时间转换的题。
题目输出要求要四舍五入到秒,中间的double强制格式转换之后出现小数,是为了在强制转换回去的时候能四舍五入,s那里的+0.5是进位用的,最后只用在输出里面强制转换并保留两位即可。
把一个时间点全部换算成秒,然后在分割成时、分、秒,这种思路能解决很多关于时间差的题目。
完整代码:
#include<stdio.h>
int main()
{
int c1,c2,h,m,s;
double c;
scanf("%d %d",&c1,&c2);
c=((double)(c2-c1))/100;
h=c/3600;
m=(c-h*3600)/60;
s=(c-h*3600-m*60)+0.5;
printf("%02d:%02d:%02d",h,m,s);
return 0;
}
TZOJ 时间戳简化版
描述
某国家安全局获得一份珍贵的材料,上面记载着一个恐怖活动的计划, 可是材料上的时间戳是linux的,即从1970.1.1日0时0分起到该时刻的总秒数, 希望你能编写一个程序,计算出该材料写的日期。 作为简化版,我们认为1年为12个月,每个月固定30天。不存在闰年。
输入
一个整数n(0<=n<=2147483647),表示从1970.1.1日0时0分开始的秒数。
输出
年月日三个整数,用空格隔开。
样例输入
1602312121
样例输出
2021 7 6
紧接在上一题之后是因为这两题思路差不多,全部化成秒。这题加入了一个闰年的判断
题目注明一年是360天,31104000是一年总共的秒数,months,days也是一样。定义一个中间变量c是用来逐级求余数的,年的余数求月,月的余数求天。
#include<stdio.h>
int main()
{
int years=31104000;
int months=2592000;
int days=86400;
int n,c,y,m,d;
scanf("%d",&n);
y=n/years;
c=n%years;
m=c/months+1;
c=c%months;
d=c/days+1;
printf("%d %d %d\n",1970+y,m,d);
return 0;
}
TZOJ 4157 Valid Set
描述
Mirko has found an old chessboard and a set of pieces in his attic. Unfortunately, the set contains only white pieces, and apparently an incorrect number of them. A set of pieces should contain:
· One king
· One queen
· Two rooks
· Two bishops
· Two knights
· Eight pawns
Mirko would like to know how many pieces of each type he should add or remove to make a valid set.
输入
The input consists of 6 integers on a single line, each between 0 and 10 (inclusive). The numbers are, in order, the numbers of kings, queens, rooks, bishops, knights and pawns in the set Mirko found.
输出
Output should consist of 6 integers on a single line; the number of pieces of each type Mirko should add or remove. If a number is positive, Mirko needs to add that many pieces. If a number is negative, Mirko needs to remove pieces.
样例输入
0 1 2 2 2 7
样例输出
1 0 0 0 0 1
其实题目的意思就是输入一个数组,然后一个一个比对过去,缺哪个缺多少直接输出要补的数量就行了。连数组的长度都已经定好了,大大简化,代码自己写吧。
这里提供一种比较方便筛选输出二合一方式,可以避免使用选择结构。
printf("%d%c",a[i]-s[i],i!=N-1?' ':'\n');
i!=N-1是否为真?如果是true,输出空格(进行下一次循环,下面还有数据要输出);如果是false,那么换行(数组已经输出到结尾,循环结束,换行)。
就先写到这里吧,其他题目,静下心来,不是问题。