PAT团体天梯赛习题集Java部分
2017-04-09 19:47
393 查看
L1-003. 个位数统计
给定一个k位整数N = dk-1*10k-1 + ... + d1*101 + 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
代码参考package 个位数统计;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
String n=sc.next();
int[] num = {0,0,0,0,0,0,0,0,0,0};
for (int i = 0; i < n.length(); i++) {
num[n.charAt(i)-48]++;
}
for(int i=0 ;i<10 ;i++){
if(num[i]!=0){
System.out.println( i+":"+num[i]);
}
}
}
}
L1-004. 计算摄氏温度
给定一个华氏温度F,本题要求编写程序,计算对应的摄氏温度C。计算公式:C = 5*(F-32)/9。题目保证输入与输出均在整型范围内。输入格式:
输入在一行中给出一个华氏温度。
输出格式:
在一行中按照格式“Celsius = C”输出对应的摄氏温度C的整数值。
输入样例:
150
输出样例:
Celsius = 65
package 计算摄氏温度; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc=new Scanner(System.in); int F=sc.nextInt(); sc.close(); int T=5*(F-32)/9; System.out.println("Celsius = "+T); } }
L1-005. 考试座位号
每个PAT考生在参加考试时都会被分配两个座位号,一个是试机座位,一个是考试座位。正常情况下,考生在入场时先得到试机座位号码,入座进入试机状态后,系统会显示该考生的考试座位号码,考试时考生需要换到考试座位就座。但有些考生迟到了,试机已经结束,他们只能拿着领到的试机座位号码求助于你,从后台查出他们的考试座位号码。输入格式:
输入第一行给出一个正整数N(<=1000),随后N行,每行给出一个考生的信息:“准考证号 试机座位号 考试座位号”。其中准考证号由14位数字组成,座位从1到N编号。输入保证每个人的准考证号都不同,并且任何时候都不会把两个人分配到同一个座位上。
考生信息之后,给出一个正整数M(<=N),随后一行中给出M个待查询的试机座位号码,以空格分隔。
输出格式:
对应每个需要查询的试机座位号码,在一行中输出对应考生的准考证号和考试座位号码,中间用1个空格分隔。
输入样例:
4 10120150912233 2 4 10120150912119 4 1 10120150912126 1 3 10120150912002 3 2 2 3 4
输出样例:
10120150912002 2 10120150912119 1
package 考试座位号; import java.util.ArrayList; import java.util.List; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc=new Scanner(System.in); int line=Integer.parseInt(sc.nextLine()); if(line>1000) return; String[] ss; String[][] aa=new String[line][3]; for (int i = 0; i <line; i++) { ss=sc.nextLine().split(" "); for (int j = 0; j < 3; j++) { aa[i][j]=ss[j]; } } int line2=sc.nextInt(); if(line2>line) return; int search=0; for (int k = 0; k < line2; k++) { search= sc.nextInt(); for (int i = 0; i < line; i++) { if(search==Integer.parseInt(aa[i][1])) System.out.println(aa[i][0]+" "+aa[i][2]); } } sc.close(); } }这个题目对于我刚入门有点难度,没有拿到满分,用了一个String[][]来存放数据,先遍历读入数据,再遍历处理数据,打印数据。仅供参考
L1-006. 连续因子
一个正整数N的因子中可能存在若干连续的数字。例如630可以分解为3*5*6*7,其中5、6、7就是3个连续的数字。给定任一正整数N,要求编写程序求出最长连续因子的个数,并输出最小的连续因子序列。输入格式:
输入在一行中给出一个正整数N(1<N<231)。
输出格式:
首先在第1行输出最长连续因子的个数;然后在第2行中按“因子1*因子2*……*因子k”的格式输出最小的连续因子序列,其中因子按递增顺序输出,1不算在内。
输入样例:
630
输出样例:
3 5*6*7
package 连续因子;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int num=sc.nextInt();
if(num<=1) return;
boolean ok = false ;
//n为连续因子的个数
int n = 0 ;
int max = 0 ;
sc.close();
List<Integer> li=new ArrayList<Integer>();
for (int i = 2; i < num; i++) {
ok = true ;
for (int j = i; j < num; j++) {
if(ok && num%j==0){
//如果ok为真 且刚好能够整除
n++ ;
}else{
//表明不能整除
ok = false ;
}
if(!ok){
if(n > max){
max = n ;
//移除所有元素 重新添加进去
li.clear();
for (int k = max; k > 0 ; k--) {
li.add(j-k);
}
}
//如果ok为假 直接break
n=0;
i = j;
break ;
}
}
}
System.out.println(li.size());
for (int i = 0; i < li.size()-1; i++) {
System.out.print(li.get(i)+"*");
} System.out.print(li.get(li.size()-1));
}
}
这个题目在网上参考了大神的想法,把因子放入集合。
L1-007. 念数字
输入一个整数,输出每个数字对应的拼音。当整数为负数时,先输出“fu”字。十个数字对应的拼音如下: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。
输入样例:
-600
输出样例:
fu liu ling ling
【分析】不多说,这个简单
package 念数字;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int num=sc.nextInt();
String[] s={"ling","yi","er","san","si","wu","liu","qi","ba","jiu","fu"};
char[] c={'0','1','2','3','4','5','6','7','8','9','-'};
String x=num+"";
for (int i = 0; i < x.length()-1; i++) {
//System.out.print(x.charAt(i));
for (int j = 0; j < c.length; j++) {
if(x.charAt(i)==c[j]){
System.out.print(s[j]+" ");
}
}
}
for (int j = 0; j < c.length; j++) {
if(x.charAt(x.length()-1)==c[j]){
System.out.print(s[j]);
}
}
}
}
L1-008. 求整数段和
给定两个整数A和B,输出从A到B的所有整数以及这些数的和。输入格式:
输入在一行中给出2个整数A和B,其中-100<=A<=B<=100,其间以空格分隔。
输出格式:
首先顺序输出从A到B的所有整数,每5个数字占一行,每个数字占5个字符宽度,向右对齐。最后在一行中输出全部数字的和。
输入样例:
-3 8
输出样例:
-3 -2 -1 0 1 2 3 4 5 6 7 8 Sum = 30
package 求整数段和; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc=new Scanner(System.in); int A=sc.nextInt(); int B=sc.nextInt(); int fivenum=0; int sum=0; for (int i = A; i < B+1; i++) { if(fivenum<4){ sum=sum+i; System.out.printf("%5s"," "+i); // System.out.print(i+" "); fivenum++; }else{ sum=sum+i; System.out.printf("%5d",i); // System.out.print(i); System.out.println(); fivenum=0; } } //右对齐 //System.out.printf("%5s",A+"s sda s"); if(fivenum!=0){ System.out.println(); } System.out.println("Sum = "+sum); } }
L1-009. N个数求和
本题的要求很简单,就是求N个数字的和。麻烦的是,这些数字是以有理数“分子/分母”的形式给出的,你输出的和也必须是有理数的形式。输入格式:
输入第一行给出一个正整数N(<=100)。随后一行按格式“a1/b1 a2/b2 ...”给出N个有理数。题目保证所有分子和分母都在长整型范围内。另外,负数的符号一定出现在分子前面。
输出格式:
输出上述数字和的最简形式 —— 即将结果写成“整数部分 分数部分”,其中分数部分写成“分子/分母”,要求分子小于分母,且它们没有公因子。如果结果的整数部分为0,则只输出分数部分。
输入样例1:
5 2/5 4/15 1/30 -2/60 8/3
输出样例1:
3 1/3
输入样例2:
2 4/3 2/3
输出样例2:
2
输入样例3:
3 1/3 -1/6 1/8
输出样例3:
7/24
package n个数求和; import java.util.ArrayList; import java.util.List; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); String[] s = new String ; long fm2 = 1; long sum = 0; //s[0] = sc.next(); //n个数 的分母相乘 for(int i=0 ;i<n ;i++){ s[i] = sc.next(); System.out.println(s[i]); if(fm2%getfm(s[i])!=0){ // 防止直接分母全部相乘超范围 fm2 *= getfm(s[i]); } } //分子乘以其他项分母 结果相加 for(int i=0 ;i<n ;i++){ sum += getfz(s[i])*fm2/getfm(s[i]); } /*大致分类 * ① 分母等于0 * ②分子(绝对值)小于分母 包括正数和负数 * ③分子等于分母 * ④分子(绝对值)大于分母 包括正数和负数 * 第④种情况就涉及到带分数 */ if(sum==0){ System.out.println(0); }else{ //如果分子和分母没有带分母 就考虑是否有公约数 再 除以公约数 if(Math.abs(sum)<fm2){ if(gcd(sum,fm2)==1){ System.out.printf("%d/%d\n",sum,fm2); }else{ System.out.printf("%d/%d\n",sum/gcd(sum,fm2),fm2/gcd(sum,fm2)); } } //如果绝对值刚好等于分母 刚好为+-1 else if(Math.abs(sum)==fm2){ if(sum<0){ System.out.println(-1); }else{ System.out.println(1); } } //或者 else{ if(sum<0){ sum =-sum; long x = sum/fm2; if(sum%fm2!=0){ System.out.printf("-%d -%d/%d\n", x,(sum-fm2*x)/gcd((sum-fm2*x),fm2),fm2/gcd((sum-fm2*x),fm2)); }else{ System.out.println(-x); } }else{ long x = sum/fm2; if(sum%fm2!=0){ System.out.printf("%d %d/%d\n", x,(sum-fm2*x)/gcd((sum-fm2*x),fm2),fm2/gcd((sum-fm2*x),fm2)); }else{ System.out.println(x); } } } } } //得到分子 public static long getfz(String s){ String[]s1 = s.split("/"); return Long.parseLong(s1[0]); } //得到分母 public static long getfm(String s){ String[]s1 = s.split("/"); return Long.parseLong(s1[1]); } public static long gcd(long a ,long b){ if(a<0){ a=-a; } if(b<0){ b= -b; } if(a<b){ long temp = a; a=b; b=temp; } if(a%b==0){ return b; }else{ return gcd(b,a%b); } } }
相关文章推荐
- PAT 团体程序设计天梯赛 部分题目题解
- L3-3. 社交集群 PAT团体设计天梯赛
- L1-6. 连续因子 PAT团体程序设计天梯赛
- PAT 团体程序设计天梯赛-练习集 L1-002. 打印沙漏
- PAT 团体程序设计天梯赛-练习集L1-011. A-B
- PAT 团体程序设计天梯赛-练习集 L1-008. 求整数段和
- PAT 《C/C++/Java/Pascal 程序设计基础》习题集 (1) IO
- PAT 团体程序设计天梯赛-练习集 L1-018. 大笨钟
- PAT 团体天梯赛 L2-002. 链表去重
- PAT 团体天梯赛 L2-001 紧急救援 (迪杰斯特拉)
- PAT 团体程序设计天梯赛-练习集 L1-016. 查验身份证
- 【题解】PAT.团体程序设计天梯赛.L3-004.肿瘤诊断
- 2016年团体程序设计天梯赛-初赛 - 大笨钟 - Java
- 2016年团体程序设计天梯赛-初赛 - 到底有多二 - Java
- 2016年团体程序设计天梯赛-初赛 - 后天 - Java
- L3-1. 凑零钱 PAT团体设计天梯赛
- PAT 团体程序设计天梯赛-练习集 L2-001. 紧急救援 【dijkstra】
- 2016年团体程序设计天梯赛-初赛 - 重要的话说三遍 - Java
- PAT 团体程序设计天梯赛-练习集 L1-005. 考试座位号
- PAT 团体程序设计天梯赛-练习集 L1-017. 到底有多二