藍橋杯2022年java試題
阿新 • • 發佈:2022-03-01
一:基礎練習:
(本文只附程式碼,解析後續修改後添上)
1.a+b問題:
程式碼如下:
1 import java.util.*; 2 public class Main { 3 public static void main(String args[]) { 4 int a,b; 5 6 Scanner input = new Scanner(System.in); 7 a = input.nextInt(); 8 b = input.nextInt(); 9 10 System.out.println(a+b);11 } 12 }
2.序列排序問題:
程式碼如下:
1 import java.util.Arrays; 2 import java.util.Scanner; 3 4 public class Main { 5 public static void main(String[] args) { 6 Scanner scanner = new Scanner(System.in); 7 int n = scanner.nextInt(); 8 int[] arr = new int[n];9 //往陣列新增元素,接收資料 10 for (int i = 0; i < n; i++) { 11 arr[i] = scanner.nextInt(); 12 } 13 14 //對陣列排序 15 Arrays.sort(arr); 16 17 //列印陣列 18 for (int i = 0; i < n; i++) { 19 System.out.print(arr[i] + " "); 20 } 21 }22 }
3.十六進位制轉八進位制:
程式碼如下:
import java.util.Scanner; public class Main { public static void main(String[] args) { Question1(); } public static void Question1() { Scanner in = new Scanner(System.in); int n = Integer.parseInt(in.nextLine()); int i, j; String[] sz = new String[n]; //讀入十六進位制數 for (i = 0; i < n; i++) { sz[i] = in.next(); } for(i = 0; i < sz.length; i++) { String s = sz[i]; StringBuilder sb = new StringBuilder(); //將一位十六進位制數轉換為四位二進位制數 for(j = 0; j < s.length(); j++) { switch(s.charAt(j)) { case '0': sb.append("0000"); break; case '1': sb.append("0001"); break; case '2': sb.append("0010"); break; case '3': sb.append("0011"); break; case '4': sb.append("0100"); break; case '5': sb.append("0101"); break; case '6': sb.append("0110"); break; case '7': sb.append("0111"); break; case '8': sb.append("1000"); break; case '9': sb.append("1001"); break; case 'A': sb.append("1010"); break; case 'B': sb.append("1011"); break; case 'C': sb.append("1100"); break; case 'D': sb.append("1101"); break; case 'E': sb.append("1110"); break; case 'F': sb.append("1111"); break; } } //再將二進位制數轉換成八進位制數 transform(sb); } } public static void transform(StringBuilder sb) { int num = sb.length() % 3; //判斷長度是否為3的倍數 switch(num) { case 0: //若轉換的八進位制數中第一位為0則刪去 if(sb.substring(0, 3).equals("000")) sb.delete(0, 3); break; case 1: if(sb.substring(0, 1).equals("0")) sb.delete(0, 1); else sb = sb.insert(0, "00"); break; case 2: if(sb.substring(0, 2).equals("00")) sb.delete(0, 2); else sb = sb.insert(0, "0"); break; } StringBuilder res = new StringBuilder(); int len = sb.length(); String[] new_s1 = new String[len/3]; //取三位轉換成八進位制數 for(int i = 0; i < len/3; i++) { int tmp = Integer.parseInt(sb.substring(i * 3, i * 3 + 3), 2); res.append(tmp); } System.out.println(res); } }View Code
4.十六進位制轉十進位制:
程式碼如下:
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); String string = scanner.nextLine(); System.out.print(Long.parseLong(string, 16)); } }
5.十進位制轉十六進位制:
程式碼如下:
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner input = new Scanner(System.in); one(input.nextInt()); } public static void one(int a){ int b; if(a<=15) { tohax(a); // System.out.print(a); } else{ b=a%16; one(a>>4); tohax(b); // System.out.print(b); } } public static void tohax(int c){ switch (c){ default: System.out.print(c); break; case 10: System.out.print("A"); break; case 11: System.out.print("B"); break; case 12: System.out.print("C"); break; case 13: System.out.print("D"); break; case 14: System.out.print("E"); break; case 15: System.out.print("F"); break; } } }
6.特殊的迴文數:
程式碼如下:
import java.util.Scanner; public class Main { final static byte one = 1;//常量1. final static byte two = 2;//常量2. final static byte ten = 10;//常量10; //輸入:正整數n。 //輸出:y行,每行為一個迴文數。 /* * 格式:迴文數每個數的和都為n * 從左讀和從右讀是一樣的,所以是關於y軸對稱。 * 資料大小:10001-999999。n的大小為2-54. * 5位的是2-45,6位的是2-54. * 要求:10進位制,五位到六位的所有正整數。 * 從小到大輸出結果。 * */ //程式如下: //1.輸入正整數n。 //2.判斷是否是偶數,不是,則說明一定是5位。 //3.判斷是否小於45,不是,則說明一定是6位。 //4.求5位。輸出結果 //5. 求6位。輸出結果 public static void main(String[] args) { Scanner input = new Scanner(System.in); byte in = input.nextByte(); //獲取到輸入到2-54的一個正整數。 if (in % two != 0) { askfive(in);//不是偶數,就只求5位 } else if (in > 45) { asksix(in);//大於45,就只求6位。 } else {//都不是,就要求5位和6位。 askfive(in); asksix(in); } } public static void askfive(byte in) { //求5位數。 //先確定第一位最小值存不存在。 for (int i = one; i <ten ; i++) {//第一位 for (int j = 0; j <ten ; j++) {//第二位 final int i0 = in - two * i - two * j; if (i0 < ten&&i0>=0) {//求第一位等於第五位,第二位等於第四位,第三位是否滿足小於10的要求的數存在。 System.out.println(i+""+j+""+i0+""+j+""+i); } } } } public static void asksix(byte in) { //求6位數。 //先確定第一位最小值存不存在。 for (int i = one; i <ten ; i++) {//第一位數 for (int j = 0; j <ten ; j++) {//第二位數 final int i1 = (in - two * i - two * j) / two; if (i1 < ten&&i1>=0) {//第三位數成立 System.out.println(i+""+j+""+ i1 +""+ i1 +""+j+""+i); } } } } }
7.迴文數:
程式碼如下:
public class Main { /* * 輸入:無 * 輸出:迴文數 * 格式要求:長度是四位的十進位制數。關於y軸對此,第一位等於第四位,第二位等於第三位。 * 範圍是1001-9999. * 要求:從小到大。 * */ //程式設計思路: //1.從第一位為1,第二位為0,開始迴圈。 //2、輸出所有這樣的數。 public static void main(String[] args) { for (int i = 1; i <10 ; i++) {//第一位 for (int j = 0; j < 10; j++) {//第二位 System.out.println(i+""+j+""+j+""+i); } } } }
8.特殊的數字:
程式碼如下:
public class Main { final static byte ten = 10;//常量10; final static byte three = 3;//常量3; /* * 輸入:無 * */ /* * 輸出:n行,三位的十進位制 * 格式要求:從小到大。 * */ //程式思路: //1、範圍是從100-999.而根據立方根來推斷,如果從立方根下手,最小要從105(1+125>100)開始迴圈,最大到962(8+216+729<999) // 2.對三個數迴圈,求和,判斷是否等於自己的10進位制。 // 3.輸出所有相等的數。 public static void main(String[] args) { for (int i = 105; i <963 ; i++) { int a = i % ten;//個位。 int b = (i / ten)%ten;//十位位。 int c = i/100 ;//百位。 if (i == (Math.pow(a, three) + Math.pow(b, three) + Math.pow(c, three))) { System.out.println(i); } } } }
9.楊輝三角:
程式碼如下:
import java.util.Scanner; public class Main { /* * 輸入:整數n * 格式要求:n的範圍是1-34. * */ /* * 輸出:n行,每一行是楊輝三角的數。 * 格式要求,每一行的每個數要按順序輸出,並且要使用一個空格分隔。 * */ //程式思路: //1、輸入一個byte大小的數,n //2、根據Cn,迴圈和遞迴的方式來求每一行每一個數 public static void main(String[] args) { Scanner input = new Scanner(System.in); byte n = input.nextByte();//獲取整形n。 askYh(n); } public static void askYh(byte n) {//求楊輝的某行。 int b = n-1;//C的下方。 if (b == 0) {//說明是第一行 System.out.println("1"); } for (int i = 0; i < n; i++) {//n行。 for (int j = 0; j <=i; j++) {//對C的上方從0到i迴圈,不能大於i。 int out = askJc(i, j) / askJc02(i, j); System.out.print(out + " "); } System.out.println();//換行。 } } public static int askJc(int i,int j) {//求b!/i! //遞迴呼叫 if (i == j + 1) { return i; } if (i == j) {//當c的上方和下方相同的時候,返回1. return 1; } return i*askJc(i-1,j); } public static int askJc02(int i,int j) {//求(b-i)! if ((i == j + 1)||(i == j)) //當i-j = 1 的和i=j的時候 return 1; return (i - j) * askJc02(i - 1, j); } }
1 import java.util.Scanner; 2 3 public class test04 { 4 5 6 /* 7 * 輸入:整數n 8 * 格式要求:n的範圍是1-34. 9 * */ 10 11 /* 12 * 輸出:n行,每一行是楊輝三角的數。 13 * 格式要求,每一行的每個數要按順序輸出,並且要使用一個空格分隔。 14 * */ 15 16 17 //程式思路: 18 //1、輸入一個byte大小的數,n 19 //2、根據Cn,迴圈和遞迴的方式來求每一行每一個數 20 21 22 public static void main(String[] args) { 23 24 Scanner input = new Scanner(System.in); 25 byte n = input.nextByte();//獲取整形n。 26 27 askYh(n); 28 29 } 30 public static void askYh(byte n) {//求楊輝的某行。 31 int b = n-1;//C的下方。 32 if (b == 0) {//說明是第一行 33 System.out.println("1"); 34 } 35 for (int i = 0; i < n; i++) {//n行。 36 for (int j = 0; j <=i; j++) {//對C的上方從0到n-1迴圈 37 int out = askJc(i, j) / askJc02(i, j); 38 System.out.print(out + " "); 39 } 40 System.out.println();//換行。 41 } 42 } 43 44 public static int askJc(int i,int j) {//求b!/i! 45 //遞迴呼叫 46 if (i == j + 1) { 47 return i; 48 } 49 if (i == j) {//當c的上方和下方相同的時候,返回1. 50 return 1; 51 } 52 return i*askJc(i-1,j); 53 } 54 55 public static int askJc02(int i,int j) {//求(b-i)! 56 if ((i == j + 1)||(i == j)) //當b-i = 1 或者i=j的時候。 57 return 1; 58 59 return (i - j) * askJc02(i - 1, j); 60 } 61 62 }
//未完,待更。。。