#Java学习#习题二

文章目录

    • 判断题
    • 函数题
      • 使用继承,实现“剪刀石头布的游戏”
    • 编程题
      • 学投资
      • 质因子分解
      • 成绩分级管理
      • 判断三角形类型
      • 按正整数的相反数字顺序输出
      • 作品评分
      • 666

其他JAVA学习的内容见:目录

判断题

1-1.系统自动引入java.lang包中的所有类,因此不需要再显式地使用import语句引入该包的所有类。

T

1-2.java.lang包是Java的核心类库,它包含了运行Java程序必不可少的系统类

T

1-3.如果一个类的声明中没有使用extends关键字,这个类被系统默认为是继承Object类。

T

1-4.为了克服单继承的缺点,Java使用了接口,一个类可以实现多个接口。

T

1-5.一个类可以实现多个接口

T

函数题

使用继承,实现“剪刀石头布的游戏”

使用继承,实现“剪刀石头布的游戏”。
小时候很喜欢玩一个游戏,“剪刀石头布”,可以是出拳的形式,或跳格子的形式。现在我们用计算机来玩这个游戏。
电脑用随机数产生剪刀石头布,游戏玩家用输入1,2,3的方式出拳。
游戏玩家输入1或2或3,分别 代表剪刀(1)石头(2)布(3)。
电脑胜出时,显示"Winner is computerPlayer."
游戏玩家胜出时,显示“Winner is personPlayer.”
平局时显示"A Draw."

函数接口定义:
根据主方法内容,实现三个类的定义,分别是是ComputerPlayer、PersonPlayer、Game类。
其中ComputerPlayer、PersonPlayer要继承Player类。
根据主方法中的用法,实现Game类。

裁判测试程序样例:

import java.util.Scanner;

class Player{
     
	String name;
	Player(String name){
     
		this.name = name;
	}
	int show() {
       //出拳方法
		int show = ( int ) (Math.random() * 10 ) %3  +1;
		return show ;
	}
}
/* 请在这里填写答案 */

public class Main {
     

	public static void main(String[] args) {
     
		ComputerPlayer c = new ComputerPlayer ("computer");
		PersonPlayer  p = new PersonPlayer("player ") ;
		Game g = new Game( c ,p );
		g.start();		
	}

}

输入样例:
2

输出样例:
A Draw.

编译程序

class ComputerPlayer extends Player {
     
    ComputerPlayer(String name) {
     
        super(name);//子类的构造方法必须调用父类的构造方法,使用super关键字;使用super关键字的这行语句必须放在子类的第一行
    }
}

class PersonPlayer extends Player{
     
    PersonPlayer(String name) {
     
        super(name);
    }
    int choice(){
     
        Scanner scan=new Scanner(System.in);
        int c=scan.nextInt();
        return c;
    }
}

class Game{
     
    ComputerPlayer cp;
    PersonPlayer pp;
    public Game(ComputerPlayer cp, PersonPlayer pp) {
     
        this.cp = cp;//切忌写成cp=cp
        this.pp = pp;
    }
    //如果刚开始不习惯用this,可以用下面替代
    //public Game(ComputerPlayer x, PersonPlayer y) {
     
    //    x = cp;//切忌写成cp=cp
    //    y = pp;
  //  }
 
    void start(){
     
        int c=cp.show(),p=pp.choice();
        if (c==p)
            System.out.print("A Draw.");
        else if (c==1&&p==3)
            System.out.print("Winner is computerPlayer.");
        else if (p==1&&c==3)
            System.out.print("Winner is personPlayer.");
        else if (p<c)
            System.out.print("Winner is computerPlayer.");
        else  System.out.print("Winner is personPlayer.");
    }
}

编程题

学投资

小白学习了一些复利投资知识,想比较一下复利能多赚多少钱(所谓复利投资,是指每年投资的本金是上一年的本金加收益。而非复利投资是指每年投资金额不包含上一年的收益,即固定投资额)。假设他每年固定投资M元(整数),每年的年收益达到P(0

输入格式:
M P N

输出格式:
复利收入(含本金),非复利收入(含本金),复利比非复利收入多的部分(全部取整,四舍五入)

输入样例:
10000 0.2 3

输出样例:
17280 16000 1280

编译程序

import java.util.Scanner;

public class Main {
     

	public static void main(String[] args) {
     
		Scanner in=new Scanner(System.in);
		int m = in.nextInt();
		double p = in.nextDouble();
		int n = in.nextInt();
		double a = 0.0, b = 0.0, c = 0.0;
		b = m * p * n +  m;
		int i;
		a = (double)m;
		for(i = 0; i < n; i++)
		{
     
			a *= 1 + p;
		}
		c = a - b;
		System.out.println(Math.round(a) + " " + Math.round(b) + " " + Math.round(c));
	}
	
}

质因子分解

本题目要求读入一个大于1的整数,编程将其分解成若干个质因子(素数因子)积的形式。

输入格式:
大于1的整数一个。

输出格式:
将输入的正整数分解成若干个质因子积的形式,质因子的出现顺序按从小到大排列。如:30=222*5;如果整数本身为质数或素数,直接输出,如:13=13。

输入样例:
12480

输出样例:
12480=2*2*2*2*2*2*3*5*13

编译程序

import java.util.Scanner;

public class Main {
     

	public static void main(String[] args) {
     
		Scanner in=new Scanner(System.in);
		int n = in.nextInt();
		System.out.print(n+"=");
		int i;
		for(i = 2; i <= Math.sqrt(n); i++)
		{
     
			if(n % i == 0)
			{
     
				System.out.print(i+"*");
				n /= i;
				i--;
			}
		}
		
		System.out.println(n);
	}
	
}

成绩分级管理

学校进行成绩分级管理,取消分数制,改为成绩分级评定。具体办法是:小于60分为E类;60分至70分(不含70分)为D类;70分至80分(不含)为C类;80分至90分(不含)为B类;90分以上为A类。设计一个程序,对输入的成绩进行等价划分

输入格式:
输入一个整数表示成绩。

输出格式:
根据输入的成绩,输出对应的等级(大写字母)

输入样例:
在这里给出一组输入。例如:
72

输出样例:
在这里给出相应的输出。例如:
C

编译程序

import java.util.Scanner;

public class Main {
     

	public static void main(String[] args) {
     
		Scanner in=new Scanner(System.in);
		int n = in.nextInt();
		if(n < 60)
			System.out.println("E");
		else if(n >= 60 && n < 70)
			System.out.println("D");
		else if(n >= 70 && n < 80)
			System.out.println("C");
		else if(n >= 80 && n < 90)
			System.out.println("B");
		else if(n >= 90)
			System.out.println("A");
	}
	
}

判断三角形类型

输入三角形三条边,判断该三角形为什么类型的三角形。

输入格式:
在一行中输入三角形的三条边的值(实型数),可以用一个或多个空格或回车分隔,其中三条边的取值范围均为[1,200]。

输出格式:
(1)如果输入数据非法,则输出“Wrong Format”;
(2)如果输入数据合法,但三条边不能构成三角形,则输出“Not a triangle”;
(3)如果输入数据合法且能够成等边三角形,则输出“Equilateral triangle”;
(4)如果输入数据合法且能够成等腰直角三角形,则输出“Isosceles right-angled triangle”;
(5)如果输入数据合法且能够成等腰三角形,则输出“Isosceles triangle”;
(6)如果输入数据合法且能够成直角三角形,则输出“Right-angled triangle”;
(7)如果输入数据合法且能够成一般三角形,则输出“General triangle”。

输入样例1:
在这里给出一组输入。例如:
50 50 50.0

输出样例1:
在这里给出相应的输出。例如:
Equilateral triangle

输入样例2:
在这里给出一组输入。例如:
60.2 60.2 80.56

输出样例2:
在这里给出相应的输出。例如:
Isosceles triangle

输入样例3:
在这里给出一组输入。例如:
0.5 20.5 80

输出样例3:
在这里给出相应的输出。例如:
Wrong Format

编译程序

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

public class Main {
     

	public static void main(String[] args) {
     
		Scanner in=new Scanner(System.in);
		double a[] = new double[3];
		int i;
		for(i = 0; i < 3; i++){
     
			a[i] = in.nextDouble();
		}
		for(i = 0; i < 3; i++){
     
			if(a[i] < 1 || a[i] > 200){
     
				System.out.println("Wrong Format");
				return;
			}
		}
		Arrays.sort(a);
		/*小补充:
		 ||当左边为真时,就不运行右边的表达式了
		  |当左边为真,还是会运算右边的表达式
		 &&当左边为假时,就不会运算右边的表达式
		  &当左边为假时,还是会运算右边的表达式*/
		if(a[0] + a[1] > a[2]){
     
			if(a[0] == a[1] && a[1] == a[2]){
     
				System.out.println("Equilateral triangle");
			}
			else if(a[0] == a[1] && a[0] * a[0] + a[1] * a[1] - a[2] * a[2] < 0.000001)
				System.out.println("Isosceles right-angled triangle");
			else if(a[2] == a[1] || a[2] == a[0] || a[0] == a[1])
				System.out.println("Isosceles triangle");
			else if(a[0] * a[0] + a[1] * a[1] - a[2] * a[2] < 0.0000010)
				System.out.println("Right-angled triangle");
			else{
     
				System.out.println("General triangle");
			}
			
		}
		else
			System.out.println("Not a triangle");
	}
	
}

按正整数的相反数字顺序输出

本题目要求输入一个正整数,按数字的相反顺序输出。

输入格式:
输入一个正整数。

输出格式:
按输入正整数的数字相反顺序输出一个数字。

输入样例:
5236

输出样例:
6325

编译程序

import java.util.Scanner;

public class Main {
     

	public static void main(String[] args) {
     
		Scanner in=new Scanner(System.in);
		int n = in.nextInt();
		int m;
		while(n != 0){
     
			m = n % 10;
			n /= 10;
			System.out.print(m);
		}
	}
	
}

作品评分

全国中小学生Scratch作品大赛拉开了序幕。每个参赛选手可以通过网络直接上传作品。本次比赛人人可做评委。每个网络评委可以通过网络对每一件作品进行打分。评分系统也是请程序高手设计的,能自动去掉一个最高分和一个最低分,求出平均分。

输入格式:
输入数据包括两行: 第一行为n,表示n个评委,n>2。 第二行是n个评委的打分,分数之间有一个空格。打分是可以带有小数部分的。

输出格式:
输出平均分,结果保留两位小数。

输入样例:
6
10 9 8 7.9 9 9.5

输出样例:
8.88

编译程序

  • 初步版:
import java.util.Scanner;
public class Main {
     
 
	public static void main(String[] args) {
     

		Scanner scan=new Scanner(System.in);
		String n=scan.nextLine();
		String s=scan.nextLine();
		int len=s.length();
		double sum=0,aver=0,maxn=-1,minn=0x3f3f3f3f;
		int cnt=0;
		int x=Integer.parseInt(n);
		while(cnt<len) {
     
			int flag=0;
			for(int i=cnt;i<len;i++) {
     
				if(s.charAt(i)==' ') {
     
					flag=1;
					String ss=s.substring(cnt,i);
					double q=Double.parseDouble(ss);
					if(q>maxn)
						maxn=q;
					if(q<minn)
						minn=q;
					sum+=q;
					cnt=i+1;
					break;
				}
			}
			if(flag==0){
     
				String ss=s.substring(cnt,len);
				Double q=Double.parseDouble(ss);
				if(q>maxn)
					maxn=q;
				if(q<minn)
					minn=q;
				sum+=q;
				break;
			}
		}
		aver=(sum-minn-maxn)/(x-2); 
		System.out.printf("%.2f\n",aver);
	}
 
}

这里常见问题是,一个个输入数,会超时,因此将他们读成字符串,然后提取有效数据
具体详解:作品评分

  • 改进版:
import java.util.Scanner;
public class Main {
     
 
	public static void main(String[] args) {
     
		Scanner in = new Scanner(System.in);
		int n = in.nextInt();
		in.nextLine();
		double sum = 0;
		String[] line  = in.nextLine().split(" ");//split方法是String类的重要方法
		for(String str : line)
		{
     
			sum = sum + Double.parseDouble(str);//包装类把String类型转换为double类型
		}
		System.out.println(String.format("%.2f", sum/n));
 
}

666

中国人非常喜欢6这个数字,因为大家总爱说66大顺啊。数学狂人李某人喜欢把什么都数字化,于是她把顺利这个词也定义了数量级,6代表1级顺利,66代表2级顺利,666代表3级顺利,以此类推。你看,数学狂人的世界总是让人无法理解。今天,李某人决定将数学进行到底,现在她设前n级顺利的和是sn。

sn=6+66+666+…+66…66(n个6)。

假设你已经知道了数字n,那么,你能帮李某人求出sn么?

输入格式:
输入一个正整数n,n的范围是[0,10)。

输出格式:
输出Sn的值。

输入样例:
2

输出样例:
72

编译程序

import java.util.Scanner;

public class Main {
     

	public static void main(String[] args) {
     
		Scanner in=new Scanner(System.in);
		int n = in.nextInt();
		int[] a = {
     0, 6, 66, 666, 6666, 66666, 666666,6666666, 66666666, 666666666};
		int i, sum = 0;
		for(i = 0; i <= n; i++)
			sum += a[i];
		System.out.println(sum);
	}
}
  • 递归版本
import java.util.Scanner;

public class Main {
     

	public static void main(String[] args) {
     
		Scanner in=new Scanner(System.in);
		int input = in.nextInt();
		if(input == 0)
			System.out.println(0);
		else
			System.out.println(sum_66(input));
	}
	public static int sum_66(int n){
     
		if(n == 1)
			return 6;
		else 
			return sum_66(n-1)+sum_pow(n);
	}
	public static int sum_pow(int n){
     
		int sum = 0;
		for(int i = 0; i < n; i++)
			sum = sum + (int)Math.pow(10, i) * 6;
		return sum;
	}
}

你可能感兴趣的:(Java学习)