PAT团体天梯赛习题集Java部分

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[n];  
	        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);  
	        }  
	    }
    
 }  

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值