java学习笔记<二>——OJ习题练习(1-7)

2020.8.24

习题1:温度转换
Description:写一个将华氏温度转换成摄氏温度的程序,转换的公式是:°F = (9/5)*°C + 32。其中C表示摄氏温度,F表示华氏温度。 程序的输入是一个整数,表示华氏温度。输出对应的摄氏温度,也是一个整数。提示,为了把计算结果的浮点数转换成整数,需要使用下面的表达式:(int)x;其中x是要转换的那个浮点数。 Input:一个整数。 Output:一个整数。 Sample Input 1: 100 Sample Output 1:37
package fhla;

import java.util.Scanner;
public class temasc {
    public static void main(String[] args){
        int input ;
        Scanner sc= new Scanner(System.in);
        input = sc.nextInt();
        int output = (int)(input-32)*5/9;
        System.out.println(output);
    }
}

在这里插入图片描述

代码理解
import java.util.Scanner;
Scanner sc= new Scanner(System.in);
input = sc.nextInt();

java.util.Scanner 是 Java5 的新特征,我们可以通过 Scanner 类来获取用户的输入。
意思是:通过new Scanner(system.in )创建一个Scanner,控制台会一直等待输入,直到敲回车键结束,把所输入的内容传给Scanner,作为扫描对象。要获取输入的内容,则只需要调用Scanner的nextLine()方法

举例:

public class TestScanner { 
	public static void main(String[] args) { //定义main方法
		Scanner s = new Scanner(System.in); //定义scanner,等待输入
		System.out.println("请输入字符串:");
		 while (true) { 
		 	String line = s.nextLine(); //读取输入内容
		 	if (line.equals("exit")) break; //如果读取到exit,则退出输入
		 	System.out.println(">>>" + line); //打印输入内容
		 	} 
		 }
	 }
代码理解
int output = (int)(input-32)*5/9;

理解: int加括号表示强制转换。浮点型精度高于整型精度,不能自动转换,必须强制转换。
例如:
int a, b;
double c = a * b; //这个编译是可以通过的
double a, b;
int c = a * b; //编译确不行,改为 int c = (int) a * b;就可以了。
JAVA精度从低到高一次如下:byte int float double

习题二:时间换算
Description:UTC是世界协调时,BJT是北京时间,UTC时间相当于BJT减去8。现在,你的程序要读入一个整数,表示BJT的时和分。整数的个位和十位表示分,百位和千位表示小时。如果小时小于10,则没有千位部分;如果小时是0,则没有百位部分;如果分小于10分,需要保留十位上的0。如1124表示11点24分,而905表示9点5分,36表示0点36分,7表示0点7分。

有效的输入范围是0到2359,即你的程序不可能从测试服务器读到0到2359以外的输入数据。
你的程序要输出这个时间对应的UTC时间,输出的格式和输入的相同,即输出一个整数,表示UTC的时和分。整数的个位和十位表示分,百位和千位表示小时。如果小时小于10,则没有千位部分;如果小时是0,则没有百位部分;如果分小于10分,需要保留十位上的0。
提醒:要小心跨日的换算。
Input:一个整数,表示BJT的时和分。整数的个位和十位表示分,百位和千位表示小时。如果小时小于10,则没有千位部分;如果小时是0,则没有百位部分;如果小时不是0而且分小于10分,需要保留十位上的0。
Output:一个整数,表示UTC的时和分。整数的个位和十位表示分,百位和千位表示小时。如果小时小于10,则没有千位部分;如果小时是0,则没有百位部分;如果小时不是0而且分小于10分,需要保留十位上的0。
Sample Input 1 :933
Sample Output 1:133

import java.util.Scanner;
public class aaa1 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int input;
		Scanner sc=new Scanner(System.in);
		input=sc.nextInt();
		int hour=input/100;
		int minu=input%100;
		if(hour>=8) {
			int output=(hour-8)*100+minu;
			System.out.println(output);
		}else {
			int output=(hour+16)*100+minu;
			System.out.println(output);
		}
	}

}

在这里插入图片描述

代码理解

加减乘除取余:+ - * / %

重点: / (取整) %(取余)
正常的除以:必须将两整数其一或是两者都强制转换为浮点数,再相除/。

补充一下:想要修改eclipse里面的类名,右键类-refactor(重构)-rename(重命名)
在这里插入图片描述

习题3:信号报告

Description:无线电台的RS制信号报告是由三两个部分组成的:
R(Readability) 信号可辨度即清晰度.
S(Strength) 信号强度即大小.
其中R位于报告第一位,共分5级,用1—5数字表示.
1—Unreadable
2—Barely readable, occasional words distinguishable
3—Readable with considerable difficulty
4—Readable with practically no difficulty
5—Perfectly readable
报告第二位是S,共分九个级别,用1—9中的一位数字表示
1—Faint signals, barely perceptible
2—Very weak signals
3—Weak signals
4—Fair signals
5—Fairly good signals
6—Good signals
7—Moderately strong signals
8—Strong signals
9—Extremely strong signals

现在,你的程序要读入一个信号报告的数字,然后输出对应的含义。如读到59,则输出:Extremely strong signals, perfectly readable.
Input:一个整数,信号报告。整数的十位部分表示可辨度,个位部分表示强度。输入的整数范围是[11,59]内有效的数字,这个范围外的数字不可能出现在测试数据中。
Output:一句话,表示这个信号报告的意义。按照题目中的文字,先输出表示强度的文字,跟上逗号和空格,然后是表示可辨度的文字,跟上句号。注意可辨度的句子的第一个字母是小写的。注意这里的标点符号都是英文的。
Sample Input 1 :33
Sample Output 1:Weak signals, readable with considerable difficulty.


import java.util.Scanner;
public class SignReport {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int input;
		Scanner sc=new Scanner(System.in);
		input=sc.nextInt();
		int R=input/10;
		int S=input%10;
		StringBuilder output=new StringBuilder("");
		switch(S) {
			case 1:
				output.append("Faint signals, barely perceptible,");
				break;
			case 2:
				output.append("Very weak signals,");
				break;
			case 3:
				output.append("Weak signals,");
				break;
			case 4:
				output.append("Fair signals,");
				break;
			case 5:
				output.append("Fairly good signals,");
				break;
			case 6:
				output.append("Good signals,");
				break;
			case 7:
				output.append("Moderately strong signals,");
				break;
			case 8:
				output.append("Strong signals,");
				break;
			case 9:
				output.append("Extremely strong signals,");
				break;
			}
		switch(R) {
			case 1:
				output.append("unreadable.");
				break;
			case 2:
				output.append("barely readable, occasional words distinguishable.");
				break;
			case 3:
				output.append("readable with considerable difficulty.");
				break;
			case 4:
				output.append("readable with practically no difficulty.");
				break;
			case 5:
				output.append("perfectly readable.");
				break;
		}
		System.out.println(output);
	}
}

在这里插入图片描述

StringBuilder 类
StringBuilder 类可以对字符串进行多次修改,并且不产生新的未使用对象。
StringBuilder output=new StringBuilder("");
append(String s):将指定的字符串追加到此字符序列。

注意: 不要忘记break。
我忘记break,会导致其他case的语句也运行,错误。
注意: 不要忘记逗号和空格。
我忘记空格,和题目要求不符合,错误

习题4:奇偶个数
Description:你的程序要读入一系列正整数数据,输入-1表示输入结束,-1本身不是输入的数据。程序输出读到的数据中的奇数和偶数的个数。

Input:一系列正整数,整数的范围是(0,100000)。如果输入-1则表示输入结束。
Output:两个整数,第一个整数表示读入数据中的奇数的个数,第二个整数表示读入数据中的偶数的个数。两个整数之间以空格分隔。
Sample Input 1 :9 3 4 2 5 7 -1
Sample Output 1:4 2

package fhla;

import java.util.Scanner;

public class OddEvenNumber {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc=new Scanner(System.in);
		int odd=0;
		int even=0;
		while(sc.hasNext()) {
			int input=sc.nextInt();
			if(input!=-1 && input%2==0) {
				even++;
			}else if(input!=-1 && input%2!=0){
				odd++;
			}else {
				break;
			}

		}
		System.out.println(odd+" "+even);
	}
}

在这里插入图片描述

报错:Exception in thread “main” java.util.InputMismatchException
在这里插入图片描述
原因:输入最后一个不是-1;而是-1;格式有问题

while (scanner.hasNext()) 和while(true)的区别

while(sc.hasNext()) 

1、读文件时,前者读完就结束,后者则死循环
2、hasNext就是还有下一个,one by one,接着是下一个,遍历完了就停止;while(true)如果条件跳不出,就是死循环。
3、你在控制台的scanner,它会等待你输入东西,循环检测你是否输入的东西,你一输入东西就被检测到了,然后执行while里面的代码,执行完后继续检测,等待直到你下一次输入东西;while(true)就不说了,不会去检测条件,无脑的不停的循环循环,执行到一定次数的时候你的Java虚拟机内存就不够了,直接爆掉

习题5:数字特征值

Description:对数字求特征值是常用的编码算法,奇偶特征是一种简单的特征值。对于一个整数,从个位开始对每一位数字编号,个位是1号,十位是2号,以此类推。这个整数在第n位上的数字记作x,如果x和n的奇偶性相同,则记下一个1,否则记下一个0。按照整数的顺序把对应位的表示奇偶性的0和1都记录下来,就形成了一个二进制数字。比如,对于342315,这个二进制数字就是001101。按照二进制位值将1的位的位值加起来就得到了结果13。
你的程序要读入一个非负整数,整数的范围是[0,100000],然后按照上述算法计算出表示奇偶性的那个二进制数字,输出它对应的十进制值。
提示:将整数从右向左分解,数位每次加1,而二进制值每次乘2。
Input:一个非负整数,整数的范围是[0,1000000]。
Output:一个整数,表示计算结果。
Sample Input 1 :342315
Sample Output 1:13

import java.util.Scanner;
public class DigitalEigenvalue {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int out=0;
		int k=0;
		Scanner sc=new Scanner(System.in);
		int input=sc.nextInt();
		String stinput=String.valueOf(input);//将int类型的input转化为string类型的stinput
		char[] stin=stinput.toCharArray();//定义了一个char类型的数组,将string类型的stinput转化为char字符数组,即每一个字符单独在数组中。
		int[] output=new int[stin.length];//新建一个int类型的数组,长度为stin的长度
		for(int i=stin.length-1;i>=0;i=i-2) {
			if(stin[i]%2==0) {
				output[i]=0;
			}else {
				output[i]=1;
			}
			if(i>=1 && stin[i-1]%2==0) {
				output[i-1]=1;
			}else if(i>=1 && stin[i-1]%2!=0) {
				output[i-1]=0;
			}
		}
		for(int j=output.length-1;j>=0;j--) {
			out=out+output[j]*(int)(Math.pow(2, k));//Math.pow(2,k)  2的k次幂
			k++;
		}
		System.out.println(out);
	}
}

在这里插入图片描述

相关代码理解

String.valueOf(); 将基本数据型态转换成 String 的 static 方法。toString() 方法功能类似 ,但是有的时候可能会出问题,建议使用String.valueOf()。

toCharArry(): 把字符串转为char字符数组;

//例如:
  String str = "abc";
 char[] arr = str.toCharArray();
 //输出
 [a, b, c]

Math.pow(): pow() 函数用来求 x 的 y 次幂(次方),其原型为: double pow(double x, double y);

2020.8.25

习题6:分数

Description:设计一个表示分数的类Fraction。这个类用两个int类型的变量分别表示分子和分母。
这个类的构造函数是:Fraction(int a, int b) 构造一个a/b的分数。
这个类要提供以下的功能:
double toDouble();将分数转换为double
Fraction plus(Fraction r);将自己的分数和r的分数相加,产生一个新的Fraction的对象。注意小学四年级学过两个分数如何相加的哈。
Fraction multiply(Fraction r);将自己的分数和r的分数相乘,产生一个新的Fraction的对象。
void print();将自己以“分子/分母”的形式输出到标准输出,并带有回车换行。如果分数是1/1,应该输出1。当分子大于分母时,不需要提出整数部分,即31/30是一个正确的输出。
注意,在创建和做完运算后应该化简分数为最简形式。如2/4应该被化简为1/2。
你写的类要和以下的代码放在一起,并请勿修改这个代码:
import java.util.Scanner;
public class Main {
public static void main(String[]args) {
Scanner in=new Scanner(System.in);
Fraction a=new Fraction(in.nextInt(),in.nextInt());
Fraction b=new Fraction(in.nextInt(),in.nextInt());
a.print();
b.print();
a.plus(b).print();
a.multiply(b).plus(new Fraction(5,6)).print();
a.print();
b.print();
in.close();
}
}

注意,你的类的定义应该这样开始:
class Fraction{
也就是说,在你的类的class前面不要有public。

Input:程序运行时会得到四个数字,分别构成两个分数,依次是分子和分母。
Output:输出一些算式。这些输入和输出都是由Main类的代码完成的,你的代码不要做输入和输出。

Sample Input 1 :2 4 1 3
Sample Output 1:
1/2
1/3
5/6
1
1/2
1/3


import java.util.Scanner;
public class Main {
    public static void main(String[]args) {
        Scanner in=new Scanner(System.in);
        Fraction a=new Fraction(in.nextInt(),in.nextInt());
        Fraction b=new Fraction(in.nextInt(),in.nextInt());
        a.print();
        b.print();
        a.plus(b).print();
        a.multiply(b).plus(new Fraction(5,6)).print();
        a.print();
        b.print();
        in.close();
    }
}
class Fraction {
	int a;
	int b;
	Fraction(int a,int b){
		this.a=a;
		this.b=b;
	}
	double  toDouble(Fraction r) {
		double c=(double)r.a/r.b;
		return c;
	}
	Fraction plus(Fraction r) {
		int plus_a=a*r.b+r.a*b;
		int plus_b=b*r.b;
		return new Fraction(plus_a,plus_b);
	}
	Fraction multiply(Fraction r) {
		int multiply_a=a*r.a;
		int multiply_b=b*r.b;
		return new Fraction(multiply_a,multiply_b);
	}
	int divisor(int a,int b) {//求公约数3,11  11,3  3,2  2,1
		if(a%b==0) {
			return b;
		}else {
			return divisor(b,a%b);//11,3  3,2   2,1
		}
				
	}
	void print() {
		if(a==0) {
			System.out.println("0");
		}else if(a%b==0) {
			System.out.println(a/b);		
		}else {
			int tmp=divisor(a,b);
			a=a/tmp;
			b=b/tmp;
			System.out.println(a+"/"+b);	
		}		
	}
}

在这里插入图片描述
相关代码理解:

求公约数

int divisor(int a,int b) {//求公约数3,11  11,3  3,2  2,1
		if(a%b==0) {
			return b;
		}else {
			return divisor(b,a%b);//11,3  3,2   2,1
		}

Fraction plus(Fraction r)
返回Fraction 对象,方法名为plus。

double toDouble(Fraction r)
返回类型 方法名 ();

习题7:第几天

Description:给定一个日期,输出这个日期是该年的第几天。
Input:数据格式为YYYY/MM/DD组成,具体参见sample input ,另外,可以向你确保所有的输入数据是合法的。
Output:输出一行,表示该日期是该年的第几天。
Sample Input 1 :1985/1/20
Sample Output 1:20


import java.util.Scanner;
public class whatday {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc=new Scanner(System.in);
		String input=sc.next();
		int start=input.indexOf("/");
		int last=input.lastIndexOf("/");
		String X=input.substring(0, start);
		String Y=input.substring(start+1, last);
		String Z=input.substring(last+1);
		int x=Integer.valueOf(X);
		int y=Integer.valueOf(Y);
		int z=Integer.valueOf(Z);
		int n;
		int out=0;
		if(x%4==0 && x%100!=0) {
			n=1;
		}else if(x%400==0) {
			n=1;
		}else {
			n=0;
		}
		for(int i=1;i<y;i++) {
			switch(i){
				case 1:
					out=out+31;
					break;
				case 2:
					if(n==1) {
						out=out+29;
					}else {
						out=out+28;
					}
					break;
				case 3:
					out=out+31;
					break;
				case 4:
					out=out+30;
					break;
				case 5:
					out=out+31;
					break;
				case 6:
					out=out+30;
					break;
				case 7:
					out=out+31;
					break;
				case 8:
					out=out+31;
					break;
				case 9:
					out=out+30;
					break;
				case 10:
					out=out+31;
					break;
				case 11:
					out=out+30;
					break;
				case 12:
					break;
			}
		}
		System.out.println(out+z);		
	}
}

在这里插入图片描述

相关代码理解:

String input = sc.next();//接收控制台输入

nextLine();这个一般用在IO中的方法,表示对数据的读取,一次性读取一行。用String接收后可进行相应处理。
nextLine();这个方法的返回值是boolean类型的,当它还有下一行可读的时候,返回的是true,当读到最后一行的时候返回false。
也就是说,我们可以再while循环中,条件使用sc.nextLine()
然后将数据全部读取出来。

indexOf() 方法: 可返回某个指定的字符串值在字符串中首次出现的位置。

lastIndexOf() 方法: 可返回一个指定的字符串值最后出现的位置,在一个字符串中的指定位置从后向前搜索。

substring() 方法: 用于提取字符串中介于两个指定下标之间的字符。substring()提取内容是从 start 处到 stop-1 处的所有字符,其长度为 stop 减 start

stringObject.substring(start,stop)`

Integer. valueOf() 可以将基本类型int转换为包装类型Integer,或者将String转换成Integer,String如果为Null或“”都会报错

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值