PAT乙级(简单模拟)1001、1011、1016、1026、1046、1012、1018(二)

简介: PAT乙级(简单模拟)1001、1011、1016、1026、1046、1012、1018

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", &times);
    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", &times);
    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 锤子剪刀布

大家应该都会玩“锤子剪刀布”的游戏:两人同时给出手势,胜负规则如图所示:

374de8c2e7c6e2fe08381ceb658e5408.jpg

现给出两人的交锋记录,请统计双方的胜、平、负次数,并且给出双方分别出什么手势的胜算最大。

输入格式:

输入第 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", &times);
    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);
}


相关文章
|
测试技术
PAT乙级(简单模拟)1001、1011、1016、1026、1046、1012、1018(一)
PAT乙级(简单模拟)1001、1011、1016、1026、1046、1012、1018
125 0
中招了,重写TreeMap的比较器引发的问题...(下)
中招了,重写TreeMap的比较器引发的问题...(下)
中招了,重写TreeMap的比较器引发的问题...(下)
中招了,重写TreeMap的比较器引发的问题...(上)
中招了,重写TreeMap的比较器引发的问题...(上)
中招了,重写TreeMap的比较器引发的问题...(上)
|
算法 人工智能
NYOJ 题目77 开灯问题(简单模拟)
开灯问题         时间限制:3000 ms  |            内存限制:65535 KB         难度:1                            描述        有n盏灯,编号为1~n,第1个人把所有灯打开,第2个人按下所有编号为2 的倍数的开关(这些灯将被关掉),第3 个人按下所有编号为3的倍数的开关(其中关掉的灯将被打开,开着的灯将被关闭),依此类推。
1328 0
|
机器学习/深度学习
1706. 球会落何处 : 简单模拟题
1706. 球会落何处 : 简单模拟题
|
JavaScript Dubbo 小程序
答应我, 不要再用 if (obj != null) 判空了
答应我, 不要再用 if (obj != null) 判空了
|
机器学习/深度学习
598. 范围求和 II : 简单模拟题
598. 范围求和 II : 简单模拟题
|
存储 安全 算法
《我要进大厂》- Java集合夺命连环13问,你能坚持到第几问?(Map | Collections)
《我要进大厂》- Java集合夺命连环13问,你能坚持到第几问?(Map | Collections)
《我要进大厂》- Java集合夺命连环13问,你能坚持到第几问?(Map | Collections)

热门文章

最新文章