蓝桥杯基本操作和运算
10-22号正式开始准备蓝桥杯的比赛,准备参加这个大学B组的Java的赛项
1.基本运算
首先就是基本的输入输出:
- system.out.print();-----进行不换行的输出
- system.out.println();-----进行换行的输出(这个同样也是我们的IDEA里面的默认输出的方式,最常使用)
- system.out.printf();--------进行格式化的输出,下面会有这个对应的题目进行说明
对于输入,我们使用的是Scanner进行的;
- Scanner in = new Scanner(System.in);
- int a=in.nextInt();-----读取到一般的整形的数据
- double b=in.nextDouble();----读取到double类型的数据
- long c = in.nextLong();—最不经常使用,如果读取的整形的数值比较大,可能会用到这个;
- String str=in.next();----------读取字符的时候到了空位置就会停止读取
- String str2=in.nextLine();--------一次就会读取一整行的操作,不会遇到空格就停止
下面的这个就是需要我们对于这个温度进行转换:我们读取的是一个整形的数据,这个时候乘上9/5的时候需要进行转换,因为如果直接写这个就会是除法操作,但是我们加上0之后,一个数据变成小数,这个进行的就是小数运算;
下面的这个是使用我们的printf进行这个格式化输出的问题:我们的这个是需要在前面补上0(如果这个位数不够的情况下),因此我们使用这个printf进行格式化的输出,%02d:%02d就是进行这个时间的格式化输出;
最后的这个计算,因为我们是使用的这个nextInt进行读取的,因此这个时候需要进行转换,强制类型转换为这个double的,当然如果我们直接使用这个nextDouble进行读取,就不需要进行强制类型转换;
2.循环–进制转换/最大公约数
2.1进制转换
下面的这个就是进制之间的转换:下面的这个是9进制转换为10进制的情况;
我们需要定义一个sum用来存储每一次计算之后的这个数据,最后我们是把这个sum进行打印输出即可;
这个数据是2022,我们要把这个(2022)这个9进制的转换为10进制的数据,这个时候需要对于这个数据的最低位取出来,分别进行这个90—91----9^2操作以此类推下去,直到这个剩下余数小于0才停止;
2.2求解最大公约数
求解最大公约数:我们首先需要使用这个nextInt方法得到两个输入的数据,接着求的两个数据里面的最小值—我们可以使用三目运算符求解最小值,也可以使用这个math里面的这个min方法求解这个最小值,其中这个三目运算符我们自己也是可以封装出来一个方法;
如果这个输入的数据除以i都是没有余数的,这个时候我们就把这个数据进行输出即可(这个地方我们可以使用for循环进行判断,因为我们知道这个最大公约数一定会比这个输入的两个数据里面的最小值还要更小,因此我们可以从这个两个数据里面的最小值作为初始的数值,然后从这个min值开始不断地减减,一直到1位置,如果两个数据除以这个i都是0,就证明这个就是公约数,而且我们一旦遇到一个满足条件的,我们就会使用这个break关键字对于这个过程进行终止,这时候得到的这个公约数就是最大的公约数);
3.数组与字符串
这个里面主要是对于这个数组的创建,数组的使用以及这个字符串的相关操作:求解字符串的长度,求解这个字符串的子串,对于这个字符串进行分割操作,以及计算这个对应字符的下标,全部转成大写等等一系列的操作;
我们下面的两个案例就是冒泡排序;
下面的这个代码可以划分为四个步骤:
1.初始化的部分:就是定义数组,初始化这个数组的大小;
2.赋值:对于这个数组里面的每一个元素,我们都需要使用这个nextInt方法进行赋值操作;
3.排序:使用冒泡的方法进行排序,这个时候如果需要的话,需要进行交换位置的操作;
4.使用for循环,对于这个冒泡排序之后的结果进行打印输出;
4.常用的API
这个常用的API主要是我们的Math和这个Integer里面的一些方法:
parseInt(String s,int radix);
例如下面的这个情况:
String str1="1010";
int num1=Integer.parseInt(str1,2);
//这个就是把我们的二进制的这个字符串str1转换为我们的十进制的整数,并且把这个转换之后的结果进行打印输出
String str2="ff";
int num2=Integer.parseInt(str2,16);
//这个就是把我们的这个16进制的字符串ff进行转换为十进制的整数并且打印输出;
toString方法—把这个整数转换为对应的进制的字符串进行表示:
int num=255;
String str1=Integer.toString(num,2);//转换为二进制的字符串
String str2=Integer.toString(num,8);//转换为八进制的字符串
String str3=Integer.toString(num,10);//转换为16进制的字符串
其他的就是这个Math里面的相关的函数,例如这个abs,min,pow之类的,这个地方就不演示了;
5.快速读写模版
快速读写就是我们输入的数据很多,如果我们还是使用这个scanner进行读取的操作,这个时候的效率就会降低,因此我们自己设计了一套快速读写的方法,提高多组输入的时候的读写效率;
import java.util.*;
import java.io.*;
//这个方法的效率高主要是因为原来的scanner和这个system需要到这个IO设备上面的文件上面里面去进行数据的读取,但是我们的这个是创建一个缓冲区,读取的时候一次性把这个文件里面的内容放到我们的缓冲区里面去,然后每一次进行裁剪数据,直接从缓冲区里面对于这个数据进行读取,因此这个可以提高效率;
//这个新定义的这个类的里面对应的方法和我们原来使用的方法的名字和功能都是一样的;
public class Main
{
//PrintWriter就是快速写的操作
public static PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));
public static Read in = new Read();
public static void main(String[] args) throws IOException
{
// 写代码(下面的这个仅仅是一个案例,具体情况需要修改)
int n=in.nextInt();
System.out.println(n);
int[] arr=new int[n];
for(int i=0;i<n;i++){
arr[i]=in.nextInt();
}
for(int i=0;i<n;i++){
out.print(arr[i]);
if(i<n-1){
out.print(" ");
}
}
out.close();
}
}
class Read // 自定义快速读入
{
StringTokenizer st = new StringTokenizer("");
//BufferedReader就是把这个IO设备里面的数据搞到我们的缓冲区里面去,然后进行裁剪
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
String next() throws IOException
{
while(!st.hasMoreTokens())
{
//bf.readLine()就是从缓冲区里面取出来一行数据,进行裁剪
//StringTokenizer就是把这个缓冲区里面的字符串转换为我们想要的数据类型
st = new StringTokenizer(bf.readLine());
//加上while循环是为了解决多行输入的问题的
}
return st.nextToken();
}
String nextLine() throws IOException
{
return bf.readLine();
}
int nextInt() throws IOException
{
return Integer.parseInt(next());
}
long nextLong() throws IOException
{
return Long.parseLong(next());
}
double nextDouble() throws IOException
{
return Double.parseDouble(next());
}
}