前 言
※ PTA是 程序设计类实验辅助教学平台 ,里边包含一些编程题目集以供练习。
※ PAT是 浙江大学计算机程序设计能力考试(Programming Ability Test),分为乙级(中文、基础编程)、甲级(英文、基础数据结构)、顶级(国际竞赛水平)。
※ 本文是PTA平台上收录的PAT乙级真题的参考代码(我自己写的),共115道题,主要用Java语言完成。
目 录
前 言
目 录
1001 害死人不偿命的(3n+1)猜想
1002 写出这个数
1003 我要通过!
1004 成绩排名
1005 继续(3n+1)猜想
1006 换个格式输出整数
1007 素数对猜想
1008 数组元素循环右移问题
1009 说反话
1010 一元多项式求导
1011 A+B 和 C
1012 数字分类
1013 数素数
1014 福尔摩斯的约会
1015 德才论
***后续题目在其它博文中更新***
题目
作者 CHEN, Yue
单位 浙江大学
卡拉兹(Callatz)猜想:
对任何一个正整数 n,如果它是偶数,那么把它砍掉一半;如果它是奇数,那么把 (3n+1) 砍掉一半。这样一直反复砍下去,最后一定在某一步得到 n=1。卡拉兹在 1950 年的世界数学家大会上公布了这个猜想,传说当时耶鲁大学师生齐动员,拼命想证明这个貌似很傻很天真的命题,结果闹得学生们无心学业,一心只证 (3n+1),以至于有人说这是一个阴谋,卡拉兹是在蓄意延缓美国数学界教学与科研的进展……
我们今天的题目不是证明卡拉兹猜想,而是对给定的任一不超过 1000 的正整数 n,简单地数一下,需要多少步(砍几下)才能得到 n=1?
输入格式:
每个测试输入包含 1 个测试用例,即给出正整数 n 的值。
输出格式:
输出从 n 计算到 1 需要的步数。
代码
import java.io.* ; //功能:给定一个正整数,计算验证卡拉兹猜想需要砍半的次数
class Main{ // 空间复杂度O(1)
public static void main(String[] args) throws IOException{
//接收输入
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int k = Integer.parseInt(br.readLine());
//计算
int i = 0; //计数器,所需要的步数
for(i = 0;k != 1;i++)
if(k%2 == 0) //若k为偶数,就砍一半
k = k/2;
else
k = (3*k+1)/2; //若k为奇数,就将(3n+1)砍一半
//打印
System.out.println(i);
}
}
题目
作者 CHEN, Yue
单位 浙江大学
读入一个正整数 n,计算其各位数字之和,用汉语拼音写出和的每一位数字。
输入格式:
每个测试输入包含 1 个测试用例,即给出自然数 n 的值。这里保证 n 小于 10^100。
输出格式:
在一行内输出 n 的各位数字之和的每一位,拼音数字间有 1 空格,但一行中最后一个拼音数字后没有空格。
输入样例:
1234567890987654321123456789
输出样例:
yi san wu
代码
import java.io.*; //功能:用汉语拼音写出一个数字的个位数字之和
class Main{ //时间复杂度O(n) 空间复杂度O(n) n为数字大小(给定字符串长度)
public static void main(String[] args) throws IOException{
//获取输入
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = br.readLine();
//计算各位数字之和
int sum = getSum(str);
//获取对应的拼音
String s = getStr(sum);
//打印
System.out.println(s.trim()); //String.trim()去除字符串首尾空格
}
//获取给定字符串的各位数字之和 //时间复杂度O(n) 空间复杂度O(1) n为字符串长度
private static int getSum(String s){
int t = 0;//各位数字之和
String c = "";//当前取出的一个数字的字符串
for (int i = 0; i
题目
作者 CHEN, Yue
单位 浙江大学
“答案正确”是自动判题系统给出的最令人欢喜的回复。本题属于 PAT 的“答案正确”大派送 —— 只要读入的字符串满足下列条件,系统就输出“答案正确”,否则输出“答案错误”。
得到“答案正确”的条件是:
P
、 A
、 T
这三种字符,不可以包含其它字符;xPATx
的字符串都可以获得“答案正确”,其中 x
或者是空字符串,或者是仅由字母 A
组成的字符串;aPbTc
是正确的,那么 aPbATca
也是正确的,其中 a
、 b
、 c
均或者是空字符串,或者是仅由字母 A
组成的字符串。现在就请你为 PAT 写一个自动裁判程序,判定哪些字符串是可以获得“答案正确”的。
输入格式:
每个测试输入包含 1 个测试用例。第 1 行给出一个正整数 n (≤10),是需要检测的字符串个数。接下来每个字符串占一行,字符串长度不超过 100,且不包含空格。
输出格式:
每个字符串的检测结果占一行,如果该字符串可以获得“答案正确”,则输出 YES
,否则输出 NO
。
输入样例:
10
PAT
PAAT
AAPATAA
AAPAATAAAA
xPATx
PT
Whatever
APAAATAA
APT
APATTAA
输出样例:
YES
YES
YES
YES
NO
NO
NO
NO
NO
NO
分析
首先要分析判定规则。
1.根据第一条规则,字符串中只能有PAT这三个字符,否则判定为NO。
2.根据第二条规则,形如 xPATx 的判定为YES,而x表示0个或多个字符A。由此可知,正确的字符串应该是,P之前可以有字符A(假设数量为a),P与T之间可以有字符A(假设数量为b),T之后可以有字符A(假设数量为c)。字符P和T是必须有且仅能有一个的,而且前后顺序是固定的。至于abc的值有什么具体要求,就要进一步分析了。题目的第二条规则说明,当b=1且a=c时,判定为YES。这可以看做是基础版的规则。
这个基础版的规则,也可以理解为,① c=a=0 , b=1 ② c=a>0 ,b=1 (也可以看做是 c / a = b=1)这两种情况都判定为YES。
3.根据第三条规则,b也可以>1,并且在第二条规则的基础上,每当b = b+1时,c=c+a,也就是说,c / a = b (当a≠0时) 。那么现在也有两种情况可以判定为YES,① c=a=0 , b≥1 ,② a≠0, c / a = b ≥ 1 。这就是判定逻辑。总结一下就是,要求b > 0;且要求 要么c=a=0 ,要么 c / a=b 。
代码
import java.io.*; //功能:根据给定规则,判断一组字符串是否正确并打印结果
class Main{ //时间复杂度O(n) 空间复杂度 O(n) n为字符串个数
public static void main(String[] args) throws IOException{
//接收输入
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
byte n = Byte.parseByte(br.readLine()); //读取待检查的字符串个数
//处理数据
String s =""; //辅助字符串,用于接收当前待检查字符串
String[] arr = new String[n]; //存放对每个字符串的检测结果,YES 或 NO
for (int i = 1;i<=n;i++){
s = br.readLine(); //依次从函数外部读取待检查的字符串
arr[i-1] = getAns(s); //计算该串是否通过的检测结果,并存入数组中
}
//打印输出
for (int i = 0;i 0 //c表示T之后有几个A,要求 要么c=a=0,要么c/a=b
byte flag = 1; //用于标记当前对字符串读取到哪个阶段,初始化标记为第一阶段
exam: for(int i = 0;i 0 ) //若读取到的字符是T,说明第二阶段结束
flag = 3; //若符合b>0的要求,则进入下一阶段
else //若不满足b>0的要求,或者读取到的是其它字符,则不符合规则,直接退出for语句的判断
break exam ;
break;
case 3: //阶段3 计算c的值
if(s.equals("A")) //每读取到一个A,则c+1
c++;
else //若读取到的是其它字符,则不符合规则,直接退出for语句的判断
break exam ;
break;
default: //应对意外情况
System.out.println("flag表示有误!");
} //switch语句
} //for语句
if(flag == 3) //依据规则要求判断字符串是否合格
if(c == a && a == 0) //符合规则的情况1:c=a=0,b>0
return "YES";
else if(c / a == b) //符合规则的情况2:c/a=b>0
return "YES";
return "NO"; //若没有完成三个阶段的计数,或者完成了但是最终结果不合格,则判定结果都是NO
} //getAns函数
} //class Main
题目
作者 CHEN, Yue
单位 浙江大学
读入 n(>0)名学生的姓名、学号、成绩,分别输出成绩最高和成绩最低学生的姓名和学号。
输入格式:
每个测试输入包含 1 个测试用例,格式为
第 1 行:正整数 n
第 2 行:第 1 个学生的姓名 学号 成绩
第 3 行:第 2 个学生的姓名 学号 成绩
... ... ...
第 n+1 行:第 n 个学生的姓名 学号 成绩
其中姓名
和学号
均为不超过 10 个字符的字符串,成绩为 0 到 100 之间的一个整数,这里保证在一组测试用例中没有两个学生的成绩是相同的。
输出格式:
对每个测试用例输出 2 行,第 1 行是成绩最高学生的姓名和学号,第 2 行是成绩最低学生的姓名和学号,字符串间有 1 空格。
输入样例:
3
Joe Math990112 89
Mike CS991301 100
Mary EE990830 95
输出样例:
Mike CS991301
Joe Math990112
代码
import java.io.*; //功能:给定一组学生姓名、学号、成绩,输出最高分与最低分学生信息
class Main{ //时间复杂度O(n) 空间复杂度O(n) n为学生个数
public static void main(String[] args) throws IOException{
//获取输入
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());//读取学生个数
//读取第一个学生的信息 题目给定n>0,因此一定能读取到至少一个学生的信息
String[] arra = new String[3]; //存储最高分学生的信息
String[] arrb = new String[3]; //存储最低分学生的信息
String[] arrc = new String[3]; //存储当前读取的学生信息
String s = "";
arra = br.readLine().split(" "); //读取第一个学生的信息
arrb = arra; //复制学生信息
//在线处理 在线处理是指,从第二个学生开始,每读取一条信息就立即更新最高分和最低分记录
for(int i=2;i<=n;i++){
arrc = br.readLine().split(" "); //读取当前学生的信息
if(Integer.parseInt(arrc[2]) > Integer.parseInt(arra[2])) //判断是否需要更新最高分记录
arra = arrc;
else if(Integer.parseInt(arrc[2]) < Integer.parseInt(arrb[2])) //判断是否需要更新最低分记录
arrb = arrc;
else //无需更新记录的话,就继续读取下一条
continue;
}
//打印输出
System.out.println(arra[0] + " " + arra[1]); //打印最高分学生信息
System.out.println(arrb[0] + " " + arrb[1]); //打印最低分学生信息
}
}
题目
作者 CHEN, Yue
单位 浙江大学
卡拉兹(Callatz)猜想已经在1001中给出了描述。在这个题目里,情况稍微有些复杂。
当我们验证卡拉兹猜想的时候,为了避免重复计算,可以记录下递推过程中遇到的每一个数。例如对 n=3 进行验证的时候,我们需要计算 3、5、8、4、2、1,则当我们对 n=5、8、4、2 进行验证的时候,就可以直接判定卡拉兹猜想的真伪,而不需要重复计算,因为这 4 个数已经在验证3的时候遇到过了,我们称 5、8、4、2 是被 3“覆盖”的数。我们称一个数列中的某个数 n 为“关键数”,如果 n 不能被数列中的其他数字所覆盖。
现在给定一系列待验证的数字,我们只需要验证其中的几个关键数,就可以不必再重复验证余下的数字。你的任务就是找出这些关键数字,并按从大到小的顺序输出它们。
输入格式:
每个测试输入包含 1 个测试用例,第 1 行给出一个正整数 K (<100),第 2 行给出 K 个互不相同的待验证的正整数 n (1 输出格式: 每个测试用例的输出占一行,按从大到小的顺序输出关键数字。数字间用 1 个空格隔开,但一行中最后一个数字后没有空格。 输入样例: 输出样例: 代码 题目 作者 CHEN, Yue 单位 浙江大学 让我们用字母 输入格式: 每个测试输入包含 1 个测试用例,给出正整数 n(<1000)。 输出格式: 每个测试用例的输出占一行,用规定的格式输出 n。 输入样例 1: 输出样例 1: 输入样例 2: 输出样例 2: 代码 题目 作者 CHEN, Yue 单位 浙江大学 让我们定义dn为:dn=pn+1−pn,其中pi是第i个素数。显然有d1=1,且对于n>1有dn是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。 现给定任意正整数 输入格式: 输入在一行给出正整数 输出格式: 在一行中输出不超过 输入样例: 输出样例: 代码 题目 作者 DS课程组 单位 浙江大学 一个数组A中存有N(>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(≥0)个位置,即将A中的数据由(A0A1⋯AN−1)变换为(AN−M⋯AN−1A0A1⋯AN−M−1)(最后M个数循环移至最前面的M个位置)。如果需要考虑程序移动数据的次数尽量少,要如何设计移动的方法? 输入格式: 每个输入包含一个测试用例,第1行输入N(1≤N≤100)和M(≥0);第2行输入N个整数,之间用空格分隔。 输出格式: 在一行中输出循环右移M位以后的整数序列,之间用空格分隔,序列结尾不能有多余空格。 输入样例: 输出样例: 代码 - C语言 这道题与2010年考研408真题42题很像,只不过将左移改为了右移。这道题我在 《【考研·数据结构】408真题 (2010年42题) 的三种解法》 这篇博客中单独写了代码实现思路。因为原先做过这道真题,于是在这里我就在录入数据后简单处理,将右移的元素个数转换为左移的元素个数,这样原来的实现代码不变。 408真题的参考答案中给出了两种解法(原地逆置法、辅助数组法),我自己写了第三种解法(循环填空法)。因为是考研真题(要求用C语言),我就用C语言实现了。不过PTA平台上的这道题,要求不能使用额外的数组,因此解法2不适用,就当做一种思路的拓展吧。 代码 - Java 下面我再用Java实现一下,作为练习。C语言Java的代码基本相同,主要是录入数据部分、打印部分有差异,还有就是有个三元运算符在C语言中测试通过但是在Java中不通过,原因不明,于是就改写为显式if-else语句。 题目 作者 CHEN, Yue 单位 浙江大学 给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。 输入格式: 测试输入包含一个测试用例,在一行内给出总长度不超过 80 的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用 1 个空格分开,输入保证句子末尾没有多余的空格。 输出格式: 每个测试用例的输出占一行,输出倒序后的句子。 输入样例: 输出样例: 代码 题目 作者 DS课程组 单位 浙江大学 设计函数求一元多项式的导数。(注:xn(n为整数)的一阶导数为nxn−1。) 输入格式: 以指数递降方式输入多项式非零项系数和指数(绝对值均为不超过 1000 的整数)。数字间以空格分隔。 输出格式: 以与输入相同的格式输出导数多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。注意“零多项式”的指数和系数都是 0,但是表示为 输入样例: 输出样例: 代码 题目 作者 HOU, Qiming 单位 浙江大学 给定区间 [−231,231] 内的 3 个整数 A、B 和 C,请判断 A+B 是否大于 C。 输入格式: 输入第 1 行给出正整数 T (≤10),是测试用例的个数。随后给出 T 组测试用例,每组占一行,顺序给出 A、B 和 C。整数间以空格分隔。 输出格式: 对每组测试用例,在一行中输出 输入样例: 输出样例: 代码 题目 作者 CHEN, Yue 单位 浙江大学 给定一系列正整数,请按要求对数字进行分类,并输出以下 5 个数字: 输入格式: 每个输入包含 1 个测试用例。每个测试用例先给出一个不超过 1000 的正整数 N,随后给出 N 个不超过 1000 的待分类的正整数。数字间以空格分隔。 输出格式: 对给定的 N 个正整数,按题目要求计算 A1~A5 并在一行中顺序输出。数字间以空格分隔,但行末不得有多余空格。 若分类之后某一类不存在数字,则在相应位置输出 输入样例 1: 输出样例 1: 输入样例 2: 输出样例 2: 代码 题目 作者 CHEN, Yue 单位 浙江大学 令 Pi 表示第 i 个素数。现任给两个正整数 M≤N≤104,请输出 PM 到 PN 的所有素数。 输入格式: 输入在一行中给出 M 和 N,其间以空格分隔。 输出格式: 输出从 PM 到 PN 的所有素数,每 10 个数字占 1 行,其间以空格分隔,但行末不得有多余空格。 输入样例: 输出样例: 代码 题目 作者 CHEN, Yue 单位 浙江大学 大侦探福尔摩斯接到一张奇怪的字条: 大侦探很快就明白了,字条上奇怪的乱码实际上就是约会的时间 输入格式: 输入在 4 行中分别给出 4 个非空、不包含空格、且长度不超过 60 的字符串。 输出格式: 在一行中输出约会的时间,格式为 输入样例: 输出样例: 代码 6
3 5 6 7 8 11
7 6
import java.io.*; //功能:给定一组数字,找出在验证卡拉兹猜想过程中的关键数,并降序输出
import java.util.*; //空间复杂度O(n)
class Main{
public static void main(String[] args) throws IOException{
//接收输入
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String s = br.readLine().trim();
int n = Integer.parseInt(s); //读取待验证的数字个数
//数组初始化
String[] arrStr = br.readLine().split(" +"); //读取待验证数字(String)
int[] arr = new int[n]; //arr数组存储所有待验证的n个正整数(int)
for(int i=0;i
1006 换个格式输出整数
B
来表示“百”、字母 S
表示“十”,用 12...n
来表示不为零的个位数字 n
(<10),换个格式来输出任一个不超过 3 位的正整数。例如 234
应该被输出为 BBSSS1234
,因为它有 2 个“百”、3 个“十”、以及个位的 4。234
BBSSS1234
23
SS123
import java.io.*; //功能:给定一个正整数,按指定规则重新输出这个数
class Main{ //时间复杂度O(n) 空间复杂度O(n) n为数值大小(给定字符串长度)
public static void main(String[] args) throws IOException{
//接收输入
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
int bai = n / 100; //获取百位数
int shi = n % 100 /10; //获取十位数
int ge = n % 10; //获取个位数
//打印
String s = "";
for (int i = 1;i<=bai;i++) //打印百位数
s = s + "B";
for (int i = 1;i<=shi;i++) //打印十位数
s = s + "S";
for (int i = 1;i<=ge;i++) //打印个位数
s = s + i;
System.out.println(s);
}
}
1007 素数对猜想
N
(<105),请计算不超过N
的满足猜想的素数对的个数。N
。N
的满足猜想的素数对的个数。20
4
import java.io.*; //给定正整数n,计算不超过n的素数对的数量
class Main{ // 时间复杂度O(n√n) 空间复杂度O(n) n为给定正整数的大小
public static void main(String[] args) throws IOException{
//接收输入
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine()); //正整数n
//处理特殊值
if(n < 5){ //若给定数字<5,则满足猜想的素数对为0,打印结果后返回
System.out.println(0);
return;
}
//计算素数对的数量 //***思路:对于≥6的整数,素数只有可能出现在6n-1或6n+1的位置,n为正整数。
int t = 1; //计数器,素数对个数(初始值为1是预加上3 5 这一对)
for(int i = 1;6*i+1<=n;i++) //遍历n,计算素数对的数量
if(ifsushu(6*i-1) && ifsushu(6*i+1) )
t++;
System.out.println(t); //打印输出
}
//判断一个整数是否是素数 时间复杂度为O(√n) 空间复杂度O(1) n为数值t的大小
private static boolean ifsushu(int t){
//判断特殊值
if(t==2 || t==3 || t==5) return true;
//若尾数不是1 3 7 9 则一定不是素数(6以上的数)
if(t%2==0 || t%5==0) return false;
//若此数不是6n+1或者6n-1,则一定不是素数(6以上的数)
if((t+1)%6!=0 && (t-1)%6!=0) return false;
//遍历检查(合数一定能分解为质数的乘积)
for(int i=1;Math.pow(6*i-1,2)<=t;i++)
if(t % (6*i-1) == 0 || t % (6*i+1) == 0)
return false;
return true;
}
}
1008 数组元素循环右移问题
6 2
1 2 3 4 5 6
5 6 1 2 3 4
#include
import java.io.*;
class Main{ //Java
public static void main(String[] args) throws IOException {
//功能:将数组元素循环右移p个元素
//这与2010年考研408的42题很像,只不过把向左移动改为了向右移动。
//录入数组数据
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] strArr = br.readLine().split(" +");
int n = Integer.parseInt(strArr[0]); //元素个数n
int p = Integer.parseInt(strArr[1]); //右移元素个数p
int t,a;
if(p%n==0) p = 0;
if(p>0) p = n - (p%n);
String[] strArr2 = br.readLine().split(" +");
int[] R = new int[n];
for(int i=0;i
1009 说反话
Hello World Here I Come
Come I Here World Hello
import java.io.*;
class Main{ //功能:将给定英文字符串按单词倒序输出
//时间复杂度 O(n) 空间复杂度O(n) n为字符串长度
public static void main(String[] args) throws IOException{
//接收输入
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] arr = br.readLine().split( " ");
//输出
String s = "";
for(int i = arr.length-1;i >= 0;i--)
s = s + (arr[i]) + " ";
System.out.println(s.trim());
}
}
1010 一元多项式求导
0 0
。3 4 -5 2 6 1 -2 0
12 3 -10 1 6 0
/*
功能:多项式求导
实现思路:根据一元多项式求导法则,每两个整数为一组,假设为a b,
则求导结果为 a*b b-1 。利用循环遍历数组即可。
时间复杂度O(n) 空间复杂度O(n) n为给定字符串长度
*/
import java.io.*;
class Main{
public static void main(String[] args) throws IOException {
//接收输入
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] arrS = br.readLine().split(" +");
//数据格式转换
int[] arr = new int[arrS.length];
for(int i=0;i
1011 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
/*
功能:判断给定的T组整数,每组A+B是否>C,并输出判断结果
实现思路:首先读取组数T,并循环处理每一组数据。
对于每一组数据,调用判断函数,直接求和。
时间复杂度O(n) 空间复杂度O(1)
*/
import java.io.*;
class Main{
public static void main(String[] args) throws IOException{
//接收输入
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String s = br.readLine().trim();
int t = Integer.parseInt(s); //录入待读取的组数并转为int
String[] arrS = new String[3]; //用于读取每一组的String数据
int[] arr = new int[3]; //用于存储每一组的int数据
String res = ""; //用于存储一行判断结果
//循环读取输入并判断
for(int i=0;i
1012 数字分类
N
。13 1 2 3 4 5 6 7 8 9 10 20 16 18
30 11 2 9.7 9
8 1 2 4 5 6 7 9 16
N 11 2 N 9
/*
功能:对输入的一组正整数,计算五项数据并输出结果。
实现思路:采用在线处理的方式,即读取一个数字就更新一次A1-A5。
计算A1-A5时要注意,该分类若没有数字,最后要输出N 。
时间复杂度O(n) 空间复杂度O(1)
*/
import java.io.*;
class Main{
public static void main(String[] args) throws IOException{
//接收输入
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] s = br.readLine().trim().split(" +");
//数据格式转换
int num = Integer.parseInt(s[0]); //正整数的个数
int n[] = new int[num];
for(int i=0;i
1013 数素数
5 27
11 13 17 19 23 29 31 37 41 43
47 53 59 61 67 71 73 79 83 89
97 101 103
/*
功能:给定两个整数M N,输出第M个素数到第N个素数之间的所有素数。
实现思路:从2开始计算素数,并计数,到达M时开始输出,到达N时停止。
*/
import java.io.*;
class Main{
public static void main(String[] args) throws IOException{
//接收输入
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] arr = br.readLine().trim().split(" +");
int m = Integer.parseInt(arr[0]);
int n = Integer.parseInt(arr[1]);
//开始计算
int t=0; //当前行输出了几个数字
String s = ""; //存储待输出的当前行
int j = 0; //计数,共出现了几个质数
for(int i=2;j
1014 福尔摩斯的约会
我们约会吧!
3485djDkxh4hhGE
2984akDfkkkkggEdsb
s&hgsfdk
d&Hyscvnm
星期四 14:04
,因为前面两字符串中第 1 对相同的大写英文字母(大小写有区分)是第 4 个字母 D
,代表星期四;第 2 对相同的字符是 E
,那是第 5 个英文字母,代表一天里的第 14 个钟头(于是一天的 0 点到 23 点由数字 0 到 9、以及大写字母 A
到 N
表示);后面两字符串第 1 对相同的英文字母 s
出现在第 4 个位置(从 0 开始计数)上,代表第 4 分钟。现给定两对字符串,请帮助福尔摩斯解码得到约会的时间。DAY HH:MM
,其中 DAY
是某星期的 3 字符缩写,即 MON
表示星期一,TUE
表示星期二,WED
表示星期三,THU
表示星期四,FRI
表示星期五,SAT
表示星期六,SUN
表示星期日。题目输入保证每个测试存在唯一解。3485djDkxh4hhGE
2984akDfkkkkggEdsb
s&hgsfdk
d&Hyscvnm
THU 14:04
/*
功能:根据给定的两个字符串中相同的字符及其出现的位置,输出结果。
使用 s.charAt(n) 来确定字符串s 在n位置的字符。
时间复杂度O(n) 空间复杂度O(n)
*/
import java.io.*;
class Main{
public static void main(String[] args) throws IOException{
//接收输入
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String s1 = br.readLine().trim();
String s2 = br.readLine().trim();
String s3 = br.readLine().trim();
String s4 = br.readLine().trim();
//开始计算
String s = ""; //输出结果
char c = ' '; //辅助
int t = 0; //辅助
for(int i=t;i
***后续题目在其它博文中更新***