Pat刷题真题乙级(1)

前言

今天在牛客上刷5道题,虽然是乙级,但是对于我这个来说还是有点难。刷题道路是很艰辛的,不过还好有Bigsai的督促和讲解,我才能一天天的坚持。虽然今天发生了一点小不愉快,但是全是出于我太菜了吧!自己烦躁也变得没有耐心,学习是一个很需要毅力的事情,不管怎么样,希望自己也能慢慢变强!

bigpian加油

Pat乙级1001A+B和C

题目链接
题目描述:

给定区间[-2的31次方, 2的31次方]内的3个整数A、B和C,请判断A+B是否大于C。

输入描述:

输入第1行给出正整数T(<=10),是测试用例的个数。随后给出T组测试用例,每组占一行,顺序给出A、B和C。整数间以空格分隔。

输出描述:

对每组测试用例,在一行中输出“Case #X: true”如果A+B>C,否则输出“Case #X: false”,其中X是测试用例的编号(从1开始)。

输入例子:

扫描二维码关注公众号,回复: 12731159 查看本文章

4
1 2 3
2 3 4
2147483647 0 2147483646
0 -2147483648 -2147483647

输出例子:

Case #1: false
Case #2: true
Case #3: true
Case #4: false

分析
要注意的是A,B,C取值可能会很大,所以定义的时候要用long类型

ac代码为:

import java.util.Scanner;
public class Niuk1001乙级 {
    
    
    public static void main(String[] args) {
    
    
        Scanner scan = new Scanner(System.in);
        int T = scan.nextInt();
        for(int i=1;i<=T;i++){
    
    
            long A = scan.nextLong();
            long B = scan.nextLong();
            long C = scan.nextLong();
            if(A+B>C){
    
    
                System.out.println("Case #"+i+": true");
            }else System.out.println("Case #"+i+": false");
        }

    }
}

Pat乙级1006(1016. 部分A+B )

题目链接
题目描述:

正整数A的“DA(为1位整数)部分”定义为由A中所有DA组成的新整数PA。例如:给定A = 3862767,DA = 6,则A的“6部分”PA是66,因为A中有2个6。

现给定A、DA、B、DB,请编写程序计算PA + PB。

输入描述:

输入在一行中依次给出A、DA、B、DB,中间以空格分隔,其中0 < A, B < 1010。

输出描述:

在一行中输出PA + PB的值。

输入例子:

3862767 6 13530293 3

输出例子:

399

分析
虽然看着题目很简单,但是这个题目实际上在考验你的类型转换功底。给A,B定义成字符串,给DA,DB定义为整型。用charAt()获取指定字符用来和A,B比较,如果相等,则加到字符串中,最后转换成整型相加输出。输出的时候要判断是否为空。

ac代码为:

import java.util.Scanner;
public class Niuk1006 {
    
    
    public static void main(String[] args) {
    
    
        Scanner scan = new Scanner(System.in);
        String PA="",PB="";
        int x =0,y=0;
        String A = scan.next();
        int DA = scan.nextInt();
        String B = scan.next();
        int DB = scan.nextInt();
        for(int i = 0;i<A.length();i++) {
    
    
            char ch = A.charAt(i);
            String str = String.valueOf(ch);
            if(DA ==Integer.parseInt(ch+"")){
    
    
                PA +=DA;
            }
        }
        for(int i = 0;i<B.length();i++) {
    
    
            char ch = B.charAt(i);
            String str = String.valueOf(ch);
            if(DB == Integer.parseInt(ch+"")){
    
    
                PB +=DB;
            }
        }
        if(PA.equals(""))x=0;//          字符串为空时为  ""
        else
        x = Integer.parseInt(PA);
        if(PB.equals(""))y=0;
        else
        y = Integer.parseInt(PB);
        System.out.println(x+y);
    }
}


Pat乙级1011(个位数统计)

题目链接
题目描述:

给定一个k位整数N = dk-110k-1 + … + d1101 + d0 (0<=di<=9, i=0,…,k-1, dk-1>0),请编写程序统计每种不同的个位数字出现的次数。例如:给定N = 100311,则有2个0,3个1,和1个3。

输入描述:

每个输入包含1个测试用例,即一个不超过1000位的正整数N。

输出描述:

对N中每一种不同的个位数字,以D:M的格式在一行中输出该位数字D及其在N中出现的次数M。要求按D的升序输出。

输入例子:

100311

输出例子:

0:2
1:3
3:1

分析
这题简单无分析。

ac代码为:

import java.util.*;
public class Niuk1011 {
    
    
    public static void main(String[] args) {
    
    
        Scanner scan = new Scanner(System.in);
        String N = scan.nextLine();
        int a[]=new int [10];
        for(int i=0;i<N.length();i++){
    
    
            char ch = N.charAt(i);
            int x = Integer.parseInt(ch+"");
           a[x]++;
        }
        for(int i=0;i<10;i++)
        {
    
    
            if(a[i]>0)
            {
    
    
                System.out.println(i+":"+a[i]);
            }
        }

Pat乙级1016(程序运行时间)

题目链接
题目描述:

要获得一个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和C1。注意两次获得的时钟打点数肯定不相同,即C1 < C2,并且取值在[0, 107]

输出描述:

在一行中输出被测函数运行的时间。运行时间必须按照“hh:mm:ss”(即2位的“时:分:秒”)格式输出;不足1秒的时间四舍五入到秒。

输入例子:

123 4577973

输出例子:

12:42:59

分析

ac代码为:

import java.util.Scanner;
public class Niuk1016 {
    
    
    public static void main(String[] args) {
    
    
        Scanner scan = new Scanner(System.in);
        int C1 = scan.nextInt();
        int C2 = scan.nextInt();
        int time = ((C2 - C1) +50) / 100;
        int hour = time / 3600;
        int minute = time % 3600 / 60;
        int seconds = time % 60;
        System.out.printf("%02d:%02d:%02d\n",hour,minute,seconds);
    }
}

Pat乙级1021(查验身份证)

题目链接
题目描述:

一个合法的身份证号码由17位地区、日期编号和顺序编号加1位校验码组成。校验码的计算规则如下:
首先对前17位数字加权求和,权重分配为:{7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};然后将计算的和对11取模得
到值Z;最后按照以下关系对应Z值与校验码M的值:
Z:0 1 2 3 4 5 6 7 8 9 10
M:1 0 X 9 8 7 6 5 4 3 2
现在给定一些身份证号码,请你验证校验码的有效性,并输出有问题的号码。

输入描述:

输入第一行给出正整数N(<= 100)是输入的身份证号码的个数。随后N行,每行给出1个18位身份证号码。

输出描述:

按照输入的顺序每行输出1个有问题的身份证号码。这里并不检验前17位是否合理,只检查前17位是否全为数字且最后1位校验码计算准确。如果所有号码都正常,

则输出“All passed”。

输入例子:
4

320124198808240056
12010X198901011234
110108196711301866
37070419881216001X

输出例子:

12010X198901011234
110108196711301866
37070419881216001X

分析
这题非常难。为了方便我把所有的集合都定义为int类型,X换成88到后面再转换,先判断前面17个数是否是数字,如果是则求权和,然后求11的余。然后判断校验码M是否为X,如果是则把求得的校验码M和坐标为17的字符进行比较。

ac代码为:


import java.util.Scanner;
public class Niuk1021 {
    
    
    public static void main(String[] args) {
    
    
        int[] wight = {
    
    7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};
        int[] Z = {
    
    0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
        int[] M = {
    
    1, 0, 88, 9, 8, 7, 6, 5, 4, 3, 2};
        Scanner scan = new Scanner(System.in);
        int N = scan.nextInt();
        scan.nextLine();
        String[] str1 = new String[N];//存放号码
        int r = 0;
        for (int i = 0; i < N; i++) {
    
    
            int num = 0;
            String str = scan.nextLine();
            for (int j = 0; j < 17; j++) {
    
    
                char ch = str.charAt(j);
                if (ch <= '9' && ch >= '0') {
    
    
                    num += Integer.parseInt(ch + "") * wight[j];//求权和
                }
            }
            int x = num % 11;//求余
            int s = M[x];
            char ch1 = str.charAt(17);
            if (ch1 == 'X') {
    
    
                if (ch1 != (char)s) {
    
    
                    str1[r++] = str;
                }
            }
            else {
    
    
                if (Integer.parseInt(ch1 + "") != s) {
    
    
                    str1[r++] = str;
                }
            }
        }
            if (r == 0) {
    
    
                System.out.println("All passed");
            } else {
    
    
                for (int i = 0; i < r; i++) {
    
    
                    System.out.println(str1[i]);
                }
            }
        }
}

猜你喜欢

转载自blog.csdn.net/qq_41638508/article/details/105400110