10.12大数据c语言自测1解题报告

写在之前的一些废话:

目前一共进行了三次内部竞赛,第一次是最简单的,最难的个人感觉是第二次,第三次难题也有,个人感觉比较中规中矩。       

第一次做解题报告,挑的是一个月前的一次内部竞赛,题目都是偏简单的,完成率也很高。

这次解题报告也不会提及太多技术上的问题(因为都是水题,没什么好提的),主要是想尝试一下整个解题报告的格式和模版,初步都是按照校队的报告形式依样画葫芦。

正文:

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,那么换行(数组已经输出到结尾,循环结束,换行)。

就先写到这里吧,其他题目,静下心来,不是问题。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

captainfly_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值