前言
今天在牛客上刷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开始)。
输入例子:
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]);
}
}
}
}