1026 程序运行时间
要获得一个 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<stdio.h> int main(){ int num1, num2, result, seconds, minutes, hours; scanf("%d%d", &num1, &num2); result = num2 - num1;//得到运行的总时针打点数 if (result % 100 >= 50){//判断四舍五入,并求得运行的总时间(秒数) result = result / 100 + 1; } else{ result /= 100; } seconds = result % 60;//对总时间的取模60得到秒数 minutes = result % 3600 / 60;//得到分钟数 hours = result / 3600;//得到小时数 //注意,这里需要打印两位数字,防止如果结果为个数的情况下只输出一位小数 printf("%02d:%02d:%02d\n", hours, minutes, seconds); return 0; }
1046 划拳
划拳是古老中国酒文化的一个有趣的组成部分。酒桌上两人划拳的方法为:每人口中喊出一个数字,同时用手比划出一个数字。如果谁比划出的数字正好等于两人喊出的数字之和,谁就赢了,输家罚一杯酒。两人同赢或两人同输则继续下一轮,直到唯一的赢家出现。下面给出甲、乙两人的划拳记录,请你统计他们最后分别喝了多少杯酒。
输入格式:
输入第一行先给出一个正整数 N(≤100),随后 N 行,每行给出一轮划拳的记录,格式为:
甲喊 甲划 乙喊 乙划
其中喊
是喊出的数字,划
是划出的数字,均为不超过 100 的正整数(两只手一起划)。
输出格式:
在一行中先后输出甲、乙两人喝酒的杯数,其间以一个空格分隔。
输入样例:
5 8 10 9 12 5 10 5 10 3 8 5 12 12 18 1 13 4 16 12 15
输出样例:
1 2
代码:
#include<stdio.h> int main() { int times, arr[4], i, j, count1 = 0, count2 = 0, temp; scanf("%d", ×); for (j = 0; j < times; j++) { i = 0; while (i < 4) {//循环输入数组元素 scanf("%d", &arr[i]); i++; } temp = arr[0] + arr[2];//得到甲乙两个人喊的总数 if ((arr[1] == temp) && (arr[3] != temp)) {//判断是否甲对乙错 count2++;//乙喝酒 } else if ((arr[1] != temp) && (arr[3] == temp)) {//判断是否甲错乙对 count1++;//甲喝酒 } } printf("%d %d\n", count1, count2); return 0; }
1012 数字分类
给定一系列正整数,请按要求对数字进行分类,并输出以下 5 个数字:
- A1 = 能被 5 整除的数字中所有偶数的和;
- A2 = 将被 5 除后余 1 的数字按给出顺序进行交错求和,即计算 n1−n2+n3−n4⋯;
- A3 = 被 5 除后余 2 的数字的个数;
- A4 = 被 5 除后余 3 的数字的平均数,精确到小数点后 1 位;
- A5 = 被 5 除后余 4 的数字中最大数字。
输入格式:每个输入包含 1 个测试用例。每个测试用例先给出一个不超过 1000 的正整数 N,随后给出 N 个不超过 1000 的待分类的正整数。数字间以空格分隔。
输出格式:
对给定的 N 个正整数,按题目要求计算 A1~A5 并在一行中顺序输出。数字间以空格分隔,但行末不得有多余空格。
若其中某一类数字不存在,则在相应位置输出 N
。
输入样例 1:
13 1 2 3 4 5 6 7 8 9 10 20 16 18
输出样例 1:
30 11 2 9.7 9
输入样例 2:
8 1 2 4 5 6 7 9 16
输出样例 2:
N 11 2 N 9
代码:(用数组更快,并且注意A2的判定,不能只是判定它是否等于0,坑人点!)
#include<stdio.h> int main(){ int times, i, num, A1 = 0, A2 = 0, A3 = 0, A4 = 0, A5 = 0, count = 0; float A4result = 0.0; scanf("%d", ×); for(i = 0; i < times; i++){ scanf("%d", &num); if ((num % 5 == 0) && (num % 2 == 0)){ A1 += num; continue;//跳出此次循环 } if (num % 5 == 1){ if (count % 2 == 0){//用count判断奇偶次加减 A2 += num; } else{ A2 -= num; } count++; continue; } if (num % 5 == 2){ A3++; continue; } if (num % 5 == 3){ A4++; A4result += num; continue; } if (num % 5 == 4){ if (num > A5){ A5 = num; } continue; } } if (A4 != 0){//如果除数为0,则会出错 A4result = (float)A4result / A4; } if (A1 == 0){ printf("N "); } else{ printf("%d ", A1); } if ((A2 == 0) && (count == 0)){//需要多判断是否最后的结果就是0 printf("N "); } else{ printf("%d ", A2); } if (A3 == 0){ printf("N "); } else{ printf("%d ", A3); } if (A4result == 0){ printf("N "); } else{ printf("%.1f ", A4result); } if (A5 == 0){ printf("N"); } else{ printf("%d", A5); } return 0; }
1018 锤子剪刀布
大家应该都会玩“锤子剪刀布”的游戏:两人同时给出手势,胜负规则如图所示:
现给出两人的交锋记录,请统计双方的胜、平、负次数,并且给出双方分别出什么手势的胜算最大。
输入格式:
输入第 1 行给出正整数 N(≤105),即双方交锋的次数。随后 N 行,每行给出一次交锋的信息,即甲、乙双方同时给出的的手势。C
代表“锤子”、J
代表“剪刀”、B
代表“布”,第 1 个字母代表甲方,第 2 个代表乙方,中间有 1 个空格。
输出格式:
输出第 1、2 行分别给出甲、乙的胜、平、负次数,数字间以 1 个空格分隔。第 3 行给出两个字母,分别代表甲、乙获胜次数最多的手势,中间有 1 个空格。如果解不唯一,则输出按字母序最小的解。
输入样例:
10 C J J B C B B B B C C C C B J B B C J J
输出样例:
5 3 2 2 3 5 B B
代码:(要注意如果存在相同的最大值(2个或者3个),则按字母序最小的输出)
#include<stdio.h> int transferNum(char a) {//通过transferNum函数来将字符版本锤子剪刀布转换成数字 if (a == 'C') {//用数字1代表锤头 return 1; } if (a == 'J') {//用数字0代表剪刀 return 0; } if (a == 'B') {//用数字-1代表布 return -1; } } char best(int* num) {//输出分别使用锤子、剪刀和布赢的次数最多的那个 int i, max = 0, j;//i用于遍历数组,max标记当前存储的最大元素的值,j标记存储最大值的下标 for (i = 0; i < 3; i++) {//判断出数组中赢最多的次数 if (num[i] > max) { max = num[i]; j = i; } } for (i = 2; i >= 0; i--){//如果存在多个相等的最值,则输出最小字母序列,即'B' if (max == num[i]){ j = i; } } if (j == 0){//按照数组的顺序输出 return 'B'; } else if (j == 1){ return 'C'; } else{ return 'J'; } } int main() { int times, A, B, i;//A和B分别用来用数字表示甲和乙所出的锤子剪刀布 int Awin = 0, Atie = 0, Alose = 0;//分别表示A赢、平和输的次数 int awin[3] = { 0 }, bwin[3] = { 0 };//用来表示a和b分别用什么赢的,并且赢了几次,元素0为布赢的次数,元素1为锤子赢的次数,元素2为剪刀赢的次数 char a, b;//a和b分别用来暂时存放甲和乙所处的锤子剪刀布 scanf("%d", ×); for (i = 0; i < times; i++) { getchar(); scanf("%c %c", &a, &b); A = transferNum(a);//将字母转为数字 B = transferNum(b); if (A == B) {//A和B的值相等,即他们所出的都是一样的,故平局次数+1 Atie++; } else if (A == 1 && B == 0) {//A锤子,B剪刀,A赢 Awin++; awin[1] += 1; } else if (A == 1 && B == -1) {//A锤子,B布,A输 Alose++; bwin[0] += 1; } else if (A == 0 && B == 1) {//A剪刀,B锤子,A输 Alose++; bwin[1] += 1; } else if (A == 0 && B == -1) {//A剪刀,B布,A赢 Awin++; awin[2] += 1; } else if (A == -1 && B == 1) {//A布,B锤子,A赢 Awin++; awin[0] += 1; } else if (A == -1 && B == 0) {//A布,B剪刀,A输 Alose++; bwin[2] += 1; } } a = best(awin); b = best(bwin); printf("%d %d %d\n", Awin, Atie, Alose); printf("%d %d %d\n", Alose, Atie, Awin);//B的胜利次数即为A的失败次数,A和B的平均次数相等,B的失败次数即为A的胜利次数 printf("%c %c", a, b); }