PTA 本页面旨在记录解题思路
L1-007 念数字 输入一个整数,输出每个数字对应的拼音。当整数为负数时,先输出fu
字。十个数字对应的拼音如下:
1 2 3 4 5 6 7 8 9 10 0: ling 1: yi 2: er 3: san 4: si 5: wu 6: liu 7: qi 8: ba 9: jiu
输入格式: 输入在一行中给出一个整数,如:1234
。
提示:整数包括负数、零和正数。
输出格式: 在一行中输出这个整数对应的拼音,每个数字的拼音之间用空格分开,行末没有最后的空格。如yi er san si
。
输入样例:
输出样例:
思路一: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 import java.util.*;public class ReadNumber { public static void main (String[] args) { Scanner sca = new Scanner (System.in); String num = sca.next(); char c [] = num.toCharArray(); HashMap map1 = new HashMap (); for (int i = 0 ;i<c.length;i++) { switch (c[i]) { case '0' : { map1.put(i, "ling" ); } break ; case '1' : { map1.put(i, "yi" ); } break ; case '2' : { map1.put(i, "er" ); } break ; case '3' : { map1.put(i, "san" ); } break ; case '4' : { map1.put(i, "si" ); } break ; case '5' : { map1.put(i, "wu" ); } break ; case '6' : { map1.put(i, "liu" ); } break ; case '7' : { map1.put(i, "qi" ); } break ; case '8' : { map1.put(i, "ba" ); } break ; case '9' : { map1.put(i, "jiu" ); } break ; default : break ; } } Set keySet = map1.keySet(); Iterator it = keySet.iterator(); if (num.charAt(0 )=='-' ){ System.out.print("fu " ); } String r = "" ; while (it.hasNext()){ Object key = it.next(); Object value = map1.get(key); r = r+value+" " ; } System.out.println(r.trim()); } }
思路二: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 import java.util.*;public class ReadNumber { public static void main (String[] args) { Scanner sca = new Scanner (System.in); String num = sca.next(); char c [] = num.toCharArray(); HashMap map = new HashMap (); HashMap map1 = new HashMap (); map.put(0 ,"ling" ); map.put(1 ,"yi" ); map.put(2 ,"er" ); map.put(3 ,"san" ); map.put(4 ,"si" ); map.put(5 ,"wu" ); map.put(6 ,"liu" ); map.put(7 ,"qi" ); map.put(8 ,"ba" ); map.put(9 ,"jiu" ); for (int i = 0 ;i<c.length;i++){ for (int j = 0 ;j<10 ;j++){ if (c[i]==j+'0' ){ map1.put(i,map.get(j)); } } } Set keySet = map1.keySet(); Iterator it = keySet.iterator(); if (num.charAt(0 )=='-' ){ System.out.print("fu " ); } String r = "" ; while (it.hasNext()){ Object key = it.next(); Object value = map1.get(key); r = r+value+" " ; } System.out.println(r.trim()); } }
L1-009 N个数求和 分数 20
全屏浏览切换布局
作者 陈越
单位 浙江大学
本题的要求很简单,就是求N
个数字的和。麻烦的是,这些数字是以有理数分子/分母
的形式给出的,你输出的和也必须是有理数的形式。
输入格式: 输入第一行给出一个正整数N
(≤100)。随后一行按格式a1/b1 a2/b2 ...
给出N
个有理数。题目保证所有分子和分母都在长整型范围内。另外,负数的符号一定出现在分子前面。
输出格式: 输出上述数字和的最简形式 —— 即将结果写成整数部分 分数部分
,其中分数部分写成分子/分母
,要求分子小于分母,且它们没有公因子。如果结果的整数部分为0,则只输出分数部分。
输入样例1: 1 2 5 2/5 4/15 1/30 -2/60 8/3
输出样例1:
输入样例2:
输出样例2:
输入样例3:
输出样例3:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 import java.util.AbstractList;import java.util.ArrayList;import java.util.Arrays;import java.util.Scanner;public class Main { public static void main (String[] args) { Scanner sca = new Scanner (System.in); ArrayList list = new ArrayList (); int n = sca.nextInt(); for (int i = 0 ;i < n;i++){ list.add(sca.next()); } String s = String.join(" " ,list); String ss[] = s.split(" " ); ArrayList listm = new ArrayList (); ArrayList listz = new ArrayList (); ArrayList listb = new ArrayList (); ArrayList listzInt = new ArrayList (); int c = 0 ,sum=0 ,max=0 ; for (int i=0 ;i<ss.length;i++){ listm.add(i,ss[i].substring(ss[i].indexOf('/' )+1 )); listz.add(i,ss[i].substring(0 ,ss[i].indexOf('/' ))); } for (int j=0 ;j<listm.size()-1 ;j++){ int n1=0 ; int a = Integer.parseInt((String) listm.get(j)); int b = Integer.parseInt((String) listm.get(j+1 )); max = zxg(a,b); c= Math.max(c,max); } for (int y=0 ;y<listm.size();y++){ listb.add(y,c/Integer.parseInt((String)listm.get(y))); listzInt.add(y,Integer.parseInt((String)listz.get(y))); int a = (Integer)listb.get(y); int b = (Integer)listzInt.get(y); sum = sum +a*b; } cz(sum,c); } public static int zxg (int a,int b) { int temp,i,n1=0 ,n2=0 ; if (b<a){ temp = b; b = a; a = temp; } for (i=a;i>0 ;i++){ if (i%a==0 &&i%b==0 ){ break ; } } return i; } public static void cz (int a,int b) { int z = 1 ,c=0 ,d=0 ; for (int i = 1 ; i <= ((a > b) ? a : b); i++) { if (a % i == 0 && b % i == 0 ) { z = i; } c = a / z; d = b / z; } if (c % d == 0 ) { System.out.println(c / d); } else if (c<d){ System.out.println(c%d+"/" +d); }else System.out.println(c / d + " " + c % d + "/" + d); } }
L1-010 比较大小 分数 10
全屏浏览切换布局
作者 杨起帆
单位 浙大城市学院
本题要求将输入的任意3个整数从小到大输出。
输入格式: 输入在一行中给出3个整数,其间以空格分隔。
输出格式: 在一行中将3个整数从小到大输出,其间以“->”相连。
输入样例:
输出样例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 import java.util.ArrayList;import java.util.Scanner;public class Main { public static void main (String[] args) { Scanner sca = new Scanner (System.in); ArrayList list = new ArrayList (); for (int i=0 ;i<3 ;i++){ list.add(sca.next()); } int a = 0 ,b = 0 ,c = 0 ,d = 0 ; a = Math.max(Integer.parseInt((String) list.get(0 )),Integer.parseInt((String) list.get(1 ))); b = Math.max(a,Integer.parseInt((String) list.get(2 ))); c = Math.min(Integer.parseInt((String) list.get(0 )),Integer.parseInt((String) list.get(1 ))); d = Math.min(c,Integer.parseInt((String) list.get(2 ))); int sum = Integer.parseInt((String) list.get(0 ))+Integer.parseInt((String) list.get(1 ))+Integer.parseInt((String) list.get(2 )); int e = sum-d-b; System.out.println(d+"->" +e+"->" +b); } }
L1-011 A-B 分数 20
全屏浏览切换布局
作者 陈越
单位 浙江大学
本题要求你计算A −B 。不过麻烦的是,A 和B 都是字符串 —— 即从字符串A 中把字符串B 所包含的字符全删掉,剩下的字符组成的就是字符串A −B 。
输入格式: 输入在2行中先后给出字符串A 和B 。两字符串的长度都不超过104,并且保证每个字符串都是由可见的ASCII码和空白字符组成,最后以换行符结束。
输出格式: 在一行中打印出A −B 的结果字符串。
输入样例: 1 2 I love GPLT! It's a fun game! aeiou
输出样例:
方案一 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 import java.util.HashMap;import java.util.Scanner;public class Main { public static void main (String[] args) { int m = 0 ,count =0 ; Scanner sca = new Scanner (System.in); String s1 = sca.nextLine(); String s2 = sca.nextLine(); HashMap map = new HashMap (); HashMap map1 = new HashMap (); for (int i = 0 ;i <s1.length();i++){ map1.put(i,s1.charAt(i)); for (int j = 0 ;j<s2.length();j++){ if (s1.charAt(i)==s2.charAt(j)){ count++; if (!map.containsValue(s2.charAt(j))) { map.put(m, s2.charAt(j)); m++; } } } } for (int i = 0 ;i<map1.size()+count;i++){ for (int j = 0 ;j<map.size();j++){ if (map1.get(i)==map.get(j)){ map1.remove(i); } } } for (Object o : map1.values()){ System.out.print(o); } } }
方案二 (搬运https://blog.csdn.net/Gracener/article/details/135491605)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 public class Main { public static void main(String[] args) throws IOException{ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String A = br.readLine(); String B = br.readLine(); HashSet<Character> setB = new HashSet<>(); for (char ch : B.toCharArray()) { setB.add(ch); } StringBuilder result = new StringBuilder(); for (char ch : A.toCharArray()) { if (!setB.contains(ch)) { result.append(ch); } } System.out.print(result.toString()); br.close(); } }
L1-015 跟奥巴马一起画方块 美国总统奥巴马不仅呼吁所有人都学习编程,甚至以身作则编写代码,成为美国历史上首位编写计算机代码的总统。2014年底,为庆祝“计算机科学教育周”正式启动,奥巴马编写了很简单的计算机代码:在屏幕上画一个正方形。现在你也跟他一起画吧!
输入格式: 输入在一行中给出正方形边长N (3≤N ≤21)和组成正方形边的某种字符C
,间隔一个空格。
输出格式: 输出由给定字符C
画出的正方形。但是注意到行间距比列间距大,所以为了让结果看上去更像正方形,我们输出的行数实际上是列数的50%(四舍五入取整)。
输入样例:
输出样例: 1 2 3 4 5 aaaaaaaaaa aaaaaaaaaa aaaaaaaaaa aaaaaaaaaa aaaaaaaaaa
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 import java.util.Arrays; import java.util.Scanner; import static java.lang.System.exit; public class Main { public static void main(String[] args) { Scanner sca = new Scanner(System.in); String str = sca.nextLine(); String[] s = str.split(" "); int column=Integer.parseInt(s[0]); String str1 = s[1]; int line =0; if(column<3||column>21){ exit(0); } if(column%2==0){ line=column/2; }else if (column%2==1){ line =column/2+1; } for(int i=1;i<=line;i++){ for(int j=1;j<=column;j++){ System.out.print(str1); } System.out.println(); } } }