PTA题目整理(java)

1.人名地名排序 (10 分)

从键盘输入若干人名、地名或者国家名,要求按照升序排序之后输出。

package pra_end;

import java.util.Arrays;
import java.util.Scanner;

public class sort {

	public static void main(String[] args) {
		Scanner in=new Scanner(System.in);
		int num=in.nextInt();
		String []str=new String[num];
		for(int i=0;i<num;i++)
		{
			String n=in.next();
			str[i]=n;
		}
		Arrays.sort(str);
//		for(int i=0;i<num;i++)
//		{
//			System.out.println(str[i]);
//		}
		for(String  a: str)//a为数组中的元素,str为数组名
			System.out.println(a);
	}

}

注意:

  • String []str=new String[num];数组定义方式
  • Arrays.sort(str);排序

 

2.字符串替换

将文本文件中指定的字符串替换成新字符串。 由于目前的OJ系统暂时不能支持用户读入文件,我们编写程序从键盘输入文件中的内容,当输入的一行为end时,表示结束。end后面有两个字符串,要求用第二个字符串替换文本中所有的第一个字符串。

package pra_end;

import java.util.Scanner;

public class str_replace {

	public static void main(String[] args) {
		Scanner in=new Scanner(System.in);
		String s="";
		while(in.hasNextLine())
		{
			String str=in.nextLine();
			if(str.equals("end"))
			{
				break;
			}
			else
				 s=s+str+"\n";//s字符串要在使用前定义
		}
		String a=in.nextLine();
		String b=in.nextLine();
		System.out.println(s.replaceAll(a, b));
	}

}

运行结果:

注意:

  • Scanner. hasNextLine();当且仅当此扫描器有另一行输入时才返回 true;
  • String.equals();判断内容是否相同;此处不能使用 if (a=="end")
  • String.replaceAll(String a, String b) 此处用b替换a;

 

 

3.两个巨大素数(质数)的乘积 (10 分)

得到两个巨大素数(质数)的乘积是简单的事,但想从该乘积分解出这两个巨大素数却是国际数学界公认的质因数分解难题。这种单向的数学关系,是不对称加密RSA算法的基本原理。 本题给出两个大素数(128bit位)的乘积和其中一个素数,请你编程求出另一个素数。

输入格式:

44022510695404470886511586569647292146578314354528108825807522926455663589709 (大素数的乘积)

189193782774204832019945226750213439577 (其中一个大素数)

输出格式:

232684764001698545563067004009755869717 (另一个素数)

import java.math.BigInteger;
import java.util.Scanner;

public class big_integer {

	public static void main(String[] args) {
		Scanner in=new Scanner(System.in);
		BigInteger a=in.nextBigInteger();
		BigInteger b=in.nextBigInteger();
		BigInteger c=a.divide(b);
		System.out.println(c);
	}

}

运算结果:

注意:

  •  BigInteger.divide(BigInteger val);返回其值为 (this / val) 的 BigInteger。
  • Scanner.nextBigInteger();将输入信息的下一个标记扫描为一个 BigInteger

 

 

4.使用公历类GregorianCalendar (10 分)

使用公历类 GregorianCalendar,公历类 GregorianCalendar有方法setTimeInMillis(long);可以用它来设置从1970年1月1日算起的一个特定时间。请编程从键盘输入一个长整型的值,然后输出对应的年、月和日。例如输入:1234567898765,输出:2009-1-14

输入格式:

1234567898765 (毫秒数)

输出格式:

2009-1-14 (输出年、月和日,实际应该是2月,因为Java API 从0开始计算月份)

import java.util.Calendar;
import java.util.Scanner;

public class calender {
	public static void main(String[] args) {
		//要把输入的数字存储为String类,然后将其转换为Long类型
		Scanner in=new Scanner(System.in);
		String s=in.next();
	Calendar c=Calendar.getInstance();
	c.setTimeInMillis(Long.parseLong(s));
	System.out.println(c.get(Calendar.YEAR)+"-"+c.get(Calendar.MONTH)+"-"+c.get(Calendar.DAY_OF_MONTH));
	}
}

 

注意:

  • 要把输入的数字存储为String类,然后将其转换为Long类型
  • Calender.DAY_OF_MONTH; (不带括号)得到一个月中的第几天。一个月中第一天的值为 1。
  • Calender.getInstance();使用默认时区和语言环境获得一个日历。
  • Long.parseLong(String s);将 string 参数解析为有符号十进制 long。
  • setTimeInMillis(long millis);用给定的 long 值设置此 Calendar 的当前时间值。

 

5.电话号码同步(Java) (10 分)

文件phonebook1.txt和phonebook2.txt中有若干联系人的姓名和电话号码。请你设计一个程序,将这两个文件中的电话号码同步。(所谓同步,就是将两个文件中的电话号码合并后剔除相同的人名和电话号码。请将同步后的电话号码按照姓名拼音顺序排序后保存到文件phonebook3.txt中。)

由于目前的OJ系统暂时不能支持用户读入文件和写文件,我们编写程序从键盘输入文件中的姓名和电话号码,当输入的单词为end时,表示文件结束。将同步后的电话号码按照姓名拼音顺序排序后输出。

输入格式:

张三 13012345678

李四 13112340000

王五 13212341111

马六 13312342222

陈七 13412343333

孙悟空 13512345555

end (表示文件phonebook1.txt结束)

张三 13012345678

孙悟空 13512345555

王五 13212341111

陈七 13412343333

唐三藏 13612346666

猪悟能 13712347777

沙悟净 13812348888

end (表示文件phonebook2.txt结束)

输出格式:

陈七 13412343333

李四 13112340000

马六 13312342222

沙悟净 13812348888

孙悟空 13512345555

唐三藏 13612346666

王五 13212341111

张三 13012345678

猪悟能 13712347777

package pra_end;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;
import java.util.TreeMap;
public class tele1 {
	public static void main(String[] args) {
		Scanner in=new Scanner(System.in);
		
		TreeMap<String, Long>  map=new TreeMap<>((String o1,String o2)->{
			return o1.compareTo(o2);
		});	
		
		String []data=new String[2];	
		while(true)
		{String str=in.nextLine();
			if(str.equals("end"))
				break;
			else
				data=str.split(" ");
				map.put(data[0], Long.parseLong(data[1]));
		}
		
		while(true)
		{String str=in.nextLine();
			if(str.equals("end"))
				break;
			else
				data=str.split(" ");//以空格把字符串分开,并且分别存储在数组data中
				map.put(data[0], Long.parseLong(data[1]));//给map中赋值
		}
		
		Set <String> keys=map.keySet();//把键存在set中
		for(String a:keys)
			System.out.println(a+" "+map.get(a));
	}

}

注意:

  • String1.compareTo(String Str2);按字典顺序比较两个字符串。
  • TreeMap(Map< extends K, extends V> m);构造一个与给定映射具有相同映射关系的新的树映射,该映射根据其键的自然顺序 进行排序。
  • 注意TreeMap<String, Long>的写法,两个括号
TreeMap<String, Long>  map=new TreeMap<> ( (String o1,String o2)->{
			return o1.compareTo(o2);
		});
  • String.split(" ");以空格拆分字符串
  • map.put(K key,V value); 给map赋值。

 

 

6.计算正五边形的面积和周长 (10 分)

从键盘输入一个数作为正五边形的边长,计算并输出该正五边形的周长和面积。

计算正五边形的面积公式为: S=a​2​​×√​25+10×√​5​​​​​​/4

输入格式:

输入正五边形的边长。例如:

5

输出格式:

输出正五边形的面积和周长。第一行输出面积,第二行输出周长。例如:

43.0119

25

import java.text.DecimalFormat;
import java.util.Scanner;

public class area_5 {
	public static void main(String[] args) {
	Scanner in=new Scanner(System.in);
	double a=in.nextDouble();
	System.out.printf("%.4f",a*a*Math.sqrt(25+10*Math.sqrt(5))/4);
	System.out.println();
	
	DecimalFormat d=new DecimalFormat("#.####");
	System.out.println(d.format(a*5));

	}

}

 注意格式:

DecimalFormat d=new DecimalFormat("#.####");
	System.out.println(d.format(a*5));

#代表此位为0则不显示

 

7.问候 (10 分)

输出问候:Hello!What's your name? 从键盘输入名字,然后输出欢迎信息。

输入格式:

请在这里写输入姓名。例如: GaiFuShuai

输出格式:

请在这里描述输出,例如:

Hello!What's your name?

GaiFuShuai,Welcome to learn OOP using C++!

import java.util.Scanner;
public class hello {

	public static void main(String[] args) {
		Scanner in=new Scanner(System.in);
		String s=in.next();
		System.out.println("Hello!What's your name?");
		System.out.println(s+",Welcome to learn OOP using C++!");
	}

}

 

8.设计一个矩形类Rectangle (10 分)

设计一个名为Rectangle的类表示矩形。这个类包括: 两个名为width和height的double型数据域,它们分别表示矩形的宽和高。width和height的默认值都为1. 一个无参构造方法。 一个为width和height指定值的矩形构造方法。 一个名为getArea()的方法返回这个矩形的面积。 一个名为getPerimeter()的方法返回这个矩形的周长。

package pra_end;

import java.util.Scanner;
class Rectangle{
double width,height;
	Rectangle()	{
			width=1;height=1;
			}
	Rectangle(double w,double h){
		width=w;height=h;
		}
	double getArea(){
		return width*height;
	}
	double getPerimeter(){
		return 2*(width+height);
	}
}
public class _2Rectangle {
	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
	    double w = input.nextDouble();
	    double h = input.nextDouble();
	    Rectangle myRectangle = new Rectangle(w, h);
	    System.out.println(myRectangle.getArea());
	    System.out.println(myRectangle.getPerimeter());
	    input.close();
	}
}

注意自定义的类写在最外层,即main类外

 

9.定义一个股票类Stock (10 分)

定义一个名为Stock的股票类,这个类包括:一个名为symbol的字符串数据域表示股票代码。一个名为name的字符串数据域表示股票名称。一个名为previousClosingPrice的double数据域,它存储前一日的股票交易价格。一个名为currentPrice数据域,它存储当前的股票交易价格。创建一个有特定代码和名称的股票的构造方法。一个名为changePercent()方法返回从previousClosingPrice变化到currentPrice的百分比。

package pra_end;

import java.util.Scanner;

class Stock{
	double previousClosingPrice;
	double currentPrice;
	String symbol;
	String name;
	Stock(String s,String n){
		symbol=s;name=n;
	}
	double changePercent(){
		return ((currentPrice-previousClosingPrice)/previousClosingPrice);
	}
}
public class _2Stock {

	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
	    String symbol1=input.next();
	    String name1=input.next();    
	    Stock stock = new Stock(symbol1, name1);
	    stock.previousClosingPrice = input.nextDouble();
	    // Input current price
	    stock.currentPrice = input.nextDouble();
	    // Display stock info
	    System.out.println(stock.name+"price changed: " + stock.changePercent() * 100 + "%");
	    input.close();
	}

}

 

10.摘苹果 (5 分)

陶陶家的院子里有一棵苹果树,每到秋天树上就会结出很多苹果。苹果成熟的时候,陶陶就会跑去摘苹果。陶陶有个30厘米高的板凳,当她不能直接用手摘到苹果的时候,就会踩到板凳上再试试。

现在已知每个苹果到地面的高度,以及陶陶把手伸直的时候能够达到的最大高度,请帮陶陶算一下她能够摘到的苹果的数目。假设她碰到苹果,苹果就会掉下来。

输入格式:

包括三行数据。 第一行是一个整数n,表示有n个苹果。苹果至少有一个,不超过1000个。 第二行包含n个100到200之间(包括100和200)的整数(以厘米为单位)分别表示这n个苹果到地面的高度,两个相邻的整数之间用一个空格隔开。 第三行是一个100到120之间(包含100和120)的整数(以厘米为单位),表示陶陶把手伸直的时候能够达到的最大高度。

输出格式:

一个整数,表示陶陶能够摘到的苹果的数目。

import java.util.Scanner;

public class _3apple {

	public static void main(String[] args) {
	Scanner in=new Scanner(System.in);
	int n=in.nextInt();
	int num=0;
	int []p=new int[n];
	for (int i=0;i<n;i++)
	{
		int m=in.nextInt();
		p[i]=m;
	}
	int h=in.nextInt();
	for(int i=0;i<n;i++)
	{
		if((h+30)>=p[i])
			num++;
	}
	System.out.println(num);
	}
}

 

11.编程题1 (10 分)

请编写程序,实现对一组整形数据的排序。

输入格式:

第一行输入一个整数n(n<=100),第二行连续输入n个整数。

输出格式:

从小到大有序的n个数。

import java.util.Arrays;
import java.util.Scanner;
public class _3sort_int {
	public static void main(String[] args) {
		Scanner in=new Scanner(System.in);
		int n=in.nextInt();
		int [] s=new int[n];
		for(int i=0;i<n;i++){
			int m=in.nextInt();
			s[i]=m;
		}
		Arrays.sort(s);
		for(int i=0;i<n;i++){
			System.out.print(s[i]+" ");
}
	}

}

 

12.选择法排序 (20 分)

本题要求将给定的n个整数从大到小排序后输出。

输入格式:

输入第一行给出一个不超过10的正整数n。第二行给出n个整数,其间以空格分隔。

输出格式:

在一行中输出从大到小有序的数列,相邻数字间有一个空格,行末不得有多余空格。

import java.util.Arrays;
import java.util.Scanner;

public class _3sel_sort {

	public static void main(String[] args) {
		Scanner in=new Scanner(System.in);
		int n=in.nextInt();
		int [] s=new int[n];
		for(int i=0;i<n;i++){
			int m=in.nextInt();
			s[i]=m;
		}
		Arrays.sort(s);
		for(int i=n-1;i>=0;i--){
			System.out.print(s[i]+" ");

	}
	}
}

 

13.查找整数 (10 分)

本题要求从输入的N个整数中查找给定的X。如果找到,输出X的位置(从0开始数);如果没有找到,输出“Not Found”。

输入格式:

输入在第一行中给出两个正整数N(≤20)和X,第二行给出N个整数。数字均不超过长整型,其间以空格分隔。

输出格式:

在一行中输出X的位置,或者“Not Found”。

import java.util.Scanner;
public class _3found {
	public static void main(String[] args) {
		Scanner in=new Scanner(System.in);
		int n=in.nextInt();
		int [] m=new int[n];
		int d=in.nextInt();
		for(int i=0;i<n;i++)
			{int u=in.nextInt();
			m[i]=u;
			}
		int flag=0;
		for(int i=0;i<n;i++)
		{
			if(m[i]==d)
			{	
				System.out.println(i);
				flag=1;
                break;
			}
		}
		if(flag==0)
			System.out.println("Not Found");
	}
}

 

14.从抽象类shape类扩展出一个圆形类Circle (10 分)

请从下列的抽象类shape类扩展出一个圆形类Circle,这个类圆形的半径radius作为私有成员,类中应包含初始化半径的构造方法。

public abstract class shape {// 抽象类

public abstract double getArea();// 求面积

public abstract double getPerimeter(); // 求周长

}

主类从键盘输入圆形的半径值,创建一个圆形对象,然后输出圆形的面积和周长。保留4位小数。

import java.util.Scanner;
import java.text.DecimalFormat;
abstract class shape {// 抽象类
    public abstract double getArea( );
    public abstract double getPerimeter( );
}
class Circle extends shape{
	private double  radius;
	Circle(double r){
		radius=r;
	}
	public  double getArea() {
		    	return (radius*radius*3.1415926);
		    }
	public double getPerimeter() {
		 return (2*3.1415926*radius);
	 }
	}

public class _4ext_circle {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        DecimalFormat d = new DecimalFormat("#.####");// 保留4位小数
         double r = input.nextDouble( ); 
        shape c = new  Circle(r);

        System.out.println(d.format(c.getArea()));
        System.out.println(d.format(c.getPerimeter()));
        input.close();
    } 
}

 

15.求正n边形的面积和周长 (10 分)

在一个正n边形(Regular Polygon)中,所有边的边长都相等,且所有角的度数相同(即这个多边形是等边、等角的)。我们已经从下列接口IShape实现了一个正n边形类RegularPolygon。其构造方法为:RegularPolygon(int n,double side); 其中n为边数,side为边长。

从键盘输入正n边形的边数n和边长a,请编程计算该正n边形的面积和周长。

interface IShape {// 接口

double getArea(); // 求面积

double getPerimeter();// 求周长

}

package pra_end;

import java.text.DecimalFormat;
import java.util.Scanner;

interface IShape {// 接口
double getArea(); // 求面积
double getPerimeter();// 求周长
}
/* 这里有正n边形类RegularPolygon的实现*/

public class _4nRegular {
    public static void main(String[] args) {
        /* 你提交的代码将嵌入到这里 */ 
    	Scanner in=new Scanner(System.in);
		int n=in.nextInt();
		double side=in.nextDouble();
        DecimalFormat d=new DecimalFormat("#.####");
		shape s=new RegularPolygon( n, side); 
		System.out.println(d.format(s.getArea()));
		System.out.println(d.format(s.getPerimeter()));
		in.close();

    }
}

 

 

16.找出最大的对象 (10 分)

(找出最大的对象)编写一个方法,返回对象数组中最大的对象。方法签名如下:

public static Object max(Comparable[] a)

所有对象都是Comparable接口的实例。对象在数组中的顺序是由compareTo方法决定的。

编写测试程序,从键盘输入5个字符串和5个整数,创建一个由5个字符串构成的数组、一个由5个整数构成的数组。找出数组中最大的字符串、整数并输出。

输入格式:

输入

Xi'an (输入5个字符串,每行一个)

Beijing

ShangHai

GuangZhou

ShenZhen

8 9 12 7 6 (输入5个整数,以空格分隔)

输出格式:

输出 Max string is Xi'an (输出最大的字符串)

Max integer is 12 (输出最大的整数)

import java.util.Arrays;
import java.util.Scanner;

public class _4max {
	public static void main(String[] args) {
	Scanner in=new Scanner(System.in);
	String[] str=new String [5];
	int [] m=new int[5];
	for(int i=0;i<5;i++)
	{
		String s=in.next();
		str[i]=s;
	}
	for(int i=0;i<5;i++)
	{
		int n=in.nextInt();
		m[i]=n;
	}
	Arrays.sort(str);
	Arrays.sort(m);
	System.out.println("Max string is "+str[4]);
	System.out.println("Max integer is "+m[4]);
	}
}

 

17.jmu-Java-06异常-finally (8 分)

代码中向系统申请资源,到最后都要将资源释放。

现有一Resource类代表资源类,包含方法:

  1. open(String str)打开资源,声明为抛出Exception(包含出错信息)。
  2. close()方法释放资源,声明为抛出RuntimeException(包含出错信息)

现在根据open(String str)中str的不同,打印不同的信息。str的内容分为4种情况:

  1. fail fail,代表open和close均会出现异常。打印open的出错信息与close的出错信息。
  2. fail success,代表open抛出异常,打印open出错信息。close正常执行,打印resource release success
  3. success fail,代表open正常执行,打印resource open success。close抛出异常,打印close出错信息。
  4. success success,代表open正常执行,打印resource open success,close正常执行打印resource release success

注1:你不用编写打印出错信息的代码。
注2:捕获异常后使用System.out.println(e)输出异常信息,e是所产生的异常。

import java.util.Scanner;
import javax.annotation.Resource;

public class _5exception {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
	    Resource resource = null;
	    try{
	        resource = new Resource();
	        resource.open(sc.nextLine());
	         /*这里放置你的答案*/
	       System.out.println("resource open success");
	       System.out.println("resource release success");
	    }
	    catch(RuntimeException e)
	    {
	    	System.out.println(e);
	    	   System.out.println("resource release success");
	    }
	    catch(Exception e)
	    { System.out.println("resource open success");
	    	System.out.println(e);
	    }
	       sc.close();
	}
 }
}

 

 

18.成绩录入时的及格与不及格人数统计 (10 分)

编写一个程序进行一个班某门课程成绩的录入,能够控制录入成绩总人数,对录入成绩统计其及格人数和不及格人数。设计一个异常类,当输入的成绩小0分或大于100分时,抛出该异常类对象,程序将捕捉这个异常对象,并调用执行该异常类对象的toString()方法,该方法获取当前无效分数值,并返回一个此分数无效的字符串。

输入格式:

从键盘中输入学生人数n

从键盘中输入第1个学生的成绩

从键盘中输入第2个学生的成绩

...

从键盘中输入第n个学生的成绩

(注:当输入的成绩无效时(即分数为小于0或大于100)可重新输入,且输出端会输出此分数无效的提醒。)

输出格式:

显示及格总人数

显示不及格总人数

 

import java.util.Scanner;
class Myexception extends Exception{
	String s;
	public Myexception(int g) {
		s=g+"invalid!";
	}
	public String tostring() {
		return s;
	}
}
public class Main{
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner input = new Scanner(System.in);
		int n=input.nextInt();//n为学生人数
		int count1=0;
		int count2=0;
		for(int i=0;i<n;i++) {
			int grade=input.nextInt();
			try {
				 if(grade<0|grade>100) {
					 n=n+1;
					 throw new Myexception(grade);
				 }
					 
			}
			catch(Myexception e){//catch块捕获异常
				System.out.println(e.tostring());//输入异常的具体信息
			}
			if(grade<60&grade>=0)
				count1++;
			else if(grade>=60&grade<=100)
				count2++;
		}
	
		System.out.println(count2);
		System.out.println(count1);
	}

}

 

19. 找素数 (10 分)

请编写程序,从键盘输入两个整数m,n,找出等于或大于m的前n个素数。

输入格式:

第一个整数为m,第二个整数为n;中间使用空格隔开。例如:

103 3

输出格式:

从小到大输出找到的等于或大于m的n个素数,每个一行。例如:

103

107

109

package pra_end;

import java.math.BigInteger;
import java.util.Scanner;

public class _6next_Prime {

	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		BigInteger m=in.nextBigInteger();
		int n=in.nextInt();
		int cout=0;
		while(cout<n)
		{
			if(m.isProbablePrime(1000))
			{
				System.out.println(m);
				cout++;
			}
			m=m.nextProbablePrime();
		}
	}
}

注意:
isProbablePrime
(int certainty)如果此 BigInteger 可能为素数,则返回 true

 

 

  • 17
    点赞
  • 155
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值