藍橋杯:全國軟體和資訊技術專業人才大賽 [1] 是由工業和資訊化部人才交流中心舉辦的全國性IT學科賽事,共有北京大學、清華大學、上海交通大學等全國1200余所高校參賽,累計參賽人數超過40萬人, [2]
2020年,藍橋杯大賽被列入中國高等教育學會發布的“全國普通高校學科競賽排行榜”,是高校教育教學改革和創新人才培養的重要競賽專案, [3]
背景:第十三屆藍橋杯Java組省賽備戰
練習題官網:藍橋杯練習系統
練習目錄
目錄
練習目錄
答題要求
題目說明
題目一
題目二
題目三
題目四
題目五
題目六
題目七
VIP題目
題目八
題目九
題目十
每周演算法練習
每日一悟
答題要求
題目說明
說明:要答題,請點擊頁面上方的“提交此題”按鈕,頁面將跳轉到提交代碼的頁面,選擇好你的編譯語言,將你的撰寫好的代碼粘貼到代碼框中,再點擊“提交答案”即可,
你的答案提交給系統后系統會自動對你的代碼進行判分,并跳轉到結果的串列里面,你可以直接從串列中看到你提交的代碼的狀態,一般幾秒鐘后就可以看到判分的結果,
本題作為第一題,在提示中已經分別給了C++和Java的代碼,你可以直接把這個代碼拷貝過去作為自己的代碼提交,
請特別注意,Java的主類名必須是Main,
題目一
數列特征
給出n個數,找出這n個數的最大值,最小值,和,
第一行為整數n,表示數的個數,
第二行有n個數,為給定的n個數,每個數的絕對值都小于10000,
輸出三行,每行一個整數,第一行表示這些數中的最大值,第二行表示這些數中的最小值,第三行表示這些數的和,
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
while (input.hasNext()) {
int math = input.nextInt();
int num = 0;
int number[] = new int[math];
for (int i = 0; i < math; i++) {
number[i] = input.nextInt();
num += number[i];
}
Arrays.sort(number);
System.out.println(number[math - 1]);
System.out.println(number[0]);
System.out.println(num);
System.exit(0);
}
}
}

題目二
字母圖形
利用字母可以組成一些美麗的圖形,下面給出了一個例子:
ABCDEFG
BABCDEF
CBABCDE
DCBABCD
EDCBABC
這是一個5行7列的圖形,請找出這個圖形的規律,并輸出一個n行m列的圖形,
輸入一行,包含兩個整數n和m,分別表示你要輸出的圖形的行數的列數,
輸出n行,每個m個字符,為你的圖形,
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int n = input.nextInt();
int m = input.nextInt();
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
char zifu = (char) (Math.abs(i - j) + 'A');
System.out.print(zifu);
}
System.out.println();
}
}
}

題目三
01字串
對于長度為5位的一個01串,每一位都可能是0或1,一共有32種可能,它們的前幾個是:
00000
00001
00010
00011
00100
請按從小到大的順序輸出這32種01串,
輸出32行,按從小到大的順序每行一個長度為5的01串,
public class Main {
public static void main(String[] args) {
for(int a = 0; a < 2; a++) {
for(int b = 0; b < 2; b++) {
for(int c = 0; c < 2; c++) {
for(int d = 0; d < 2; d++) {
for(int e = 0; e < 2; e++) {
System.out.println(""+a+b+c+d+e);
}
}
}
}
}
}
}

題目四
閏年判斷
給定一個年份,判斷這一年是不是閏年,
當以下情況之一滿足時,這一年是閏年:
1. 年份是4的倍數而不是100的倍數;
2. 年份是400的倍數,
其他的年份都不是閏年,
輸入包含一個整數y,表示當前的年份,
輸出一行,如果給定的年份是閏年,則輸出yes,否則輸出no,
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int num = input.nextInt();
if (num % 4 == 0 && num % 100 != 0 || num % 400 == 0) {
System.out.println("yes");
} else {
System.out.println("no");
}
}
}

題目五
Fibonacci數列
Fibonacci數列的遞推公式為:Fn=Fn-1+Fn-2,其中F1=F2=1,
當n比較大時,Fn也非常大,現在我們想知道,Fn除以10007的余數是多少,
輸入包含一個整數n,
輸出一行,包含一個整數,表示Fn除以10007的余數,
說明:在本題中,答案是要求Fn除以10007的余數,因此我們只要能算出這個余數即可,而不需要先計算出Fn的準確值,再將計算的結果除以10007取余數,直接計算余數往往比先算出原數再取余簡單,
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int num = input.nextInt();
int remainder = 0;
int number[] = new int[num + 1];
for (int i = 3; i <= num; i++) {
number[0] = 0;
number[1] = 1;
number[2] = 1;
number[i] = number[i - 1] + number[i - 2];
remainder = number[i] % 10007;
}
System.out.println(remainder);
}
}

題目六
圓的面積
給定圓的半徑r,求圓的面積,
輸入包含一個整數r,表示圓的半徑,
輸出一行,包含一個實數,四舍五入保留小數點后7位,表示圓的面積,
說明:在本題中,輸入是一個整數,但是輸出是一個實數,
對于實數輸出的問題,請一定看清楚實數輸出的要求,比如本題中要求保留小數點后7位,則你的程式必須嚴格的輸出7位小數,輸出過多或者過少的小數位數都是不行的,都會被認為錯誤,
實數輸出的問題如果沒有特別說明,舍入都是按四舍五入進行,
提示:本題對精度要求較高,請注意π的值應該取較精確的值,你可以使用常量來表示π,比如PI=3.14159265358979323,也可以使用數學公式來求π,比如PI=atan(1.0)*4,
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int r = input.nextInt();
double area = Math.PI*r*r*10000000;
System.out.println((double)Math.round(area)/10000000);
}
}

題目七
序列求和
求1+2+3+...+n的值,
輸入包括一個整數n,
輸出一行,包括一個整數,表示1+2+3+...+n的值,
說明:有一些試題會給出多組樣例輸入輸出以幫助你更好的做題,
一般在提交之前所有這些樣例都需要測驗通過才行,但這不代表這幾組樣例資料都正確了你的程式就是完全正確的,潛在的錯誤可能仍然導致你的得分較低,
說明:請注意這里的資料規模,
本題直接的想法是直接使用一個回圈來累加,然而,當資料規模很大時,這種“暴力”的方法往往會導致超時,此時你需要想想其他方法,你可以試一試,如果使用1000000000作為你的程式的輸入,你的程式是不是能在規定的上面規定的時限內運行出來,
本題另一個要值得注意的地方是答案的大小不在你的語言默認的整型(int)范圍內,如果使用整型來保存結果,會導致結果錯誤,
如果你使用C++或C語言而且準備使用printf輸出結果,則你的格式字串應該寫成%I64d以輸出long long型別的整數,
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int math = input.nextInt();
long sum = 0;
for (long i = 0; i <= math; i++) {
sum += i;
}
System.out.println(sum);
}
}

VIP題目
題目八
階乘計算
輸入一個正整數n,輸出n!的值,
其中n!=1*2*3*…*n,演算法描述:n!可能很大,而計算機能表示的整數范圍有限,需要使用高精度計算的方法,使用一個陣列A來表示一個大整數a,A[0]表示a的個位,A[1]表示a的十位,依次類推,
將a乘以一個整數k變為將陣列A的每一個元素都乘以k,請注意處理相應的進位,
首先將a設為1,然后乘2,乘3,當乘到n時,即得到了n!的值,輸入包含一個正整數n,n<=1000,
輸出n!的準確值,
import java.math.BigInteger;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int number = input.nextInt();
BigInteger bg = new BigInteger("1");
for (int i = 1; i <= number; i++) {
String n = String.valueOf(i);
bg = (new BigInteger(n)).multiply(bg);
}
System.out.println(bg);
}
}

題目九
高精度加法
輸入兩個整數a和b,輸出這兩個整數的和,a和b都不超過100位,
由于a和b都比較大,所以不能直接使用語言中的標準資料型別來存盤,對于這種問題,一般使用陣列來處理,
定義一個陣列A,A[0]用于存盤a的個位,A[1]用于存盤a的十位,依此類推,同樣可以用一個陣列B來存盤b,
計算c = a + b的時候,首先將A[0]與B[0]相加,如果有進位產生,則把進位(即和的十位數)存入r,把和的個位數存入C[0],即C[0]等于(A[0]+B[0])%10,然后計算A[1]與B[1]相加,這時還應將低位進上來的值r也加起來,即C[1]應該是A[1]、B[1]和r三個數的和.如果又有進位產生,則仍可將新的進位存入到r中,和的個位存到C[1]中,依此類推,即可求出C的所有位,
最后將C輸出即可,輸入包括兩行,第一行為一個非負整數a,第二行為一個非負整數b,兩個整數都不超過100位,兩數的最高位都不是0,
輸出一行,表示a + b的值,
import java.math.BigInteger;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
String a = input.next();
String b = input.next();
int[] arr = new int[100];
int[] brr = new int[100];
int[] crr = new int[101];
int r = 0;
int count = 0;
for (int i = a.length() - 1; i >= 0; i--) {
arr[count++] = Integer.parseInt(a.substring(i, i + 1));
}
count = 0;
for (int i = b.length() - 1; i >= 0; i--) {
brr[count++] = Integer.parseInt(b.substring(i, i + 1));
}
for (int i = 0; i < 100; i++) {
if ((crr[i] = (arr[i] + brr[i]) % 10 + r) == 10) {
crr[i] = 0;
r = 1;
continue;
}
crr[i] = (arr[i] + brr[i]) % 10 + r;
if (arr[i] + brr[i] > 10) {
r = 1;
} else {
r = 0;
}
}
int x = valid(crr);
for (int i = x; i >= 0; i--) {
System.out.print(crr[i]);
}
}
public static int valid(int crr[]) {
int tmp = 0;
for (int i = 100; i >= 0; i--) {
if (crr[i] != 0) {
return i;
}
}
return 100;
}
}

題目十
Huffuman樹
Huffman樹在編碼中有著廣泛的應用,在這里,我們只關心Huffman樹的構造程序,
給出一列數{pi}={p0, p1, …, pn-1},用這列數構造Huffman樹的程序如下:
1. 找到{pi}中最小的兩個數,設為pa和pb,將pa和pb從{pi}中洗掉掉,然后將它們的和加入到{pi}中,這個程序的費用記為pa + pb,
2. 重復步驟1,直到{pi}中只剩下一個數,
在上面的操作程序中,把所有的費用相加,就得到了構造Huffman樹的總費用,
本題任務:對于給定的一個數列,現在請你求出用該數列構造Huffman樹的總費用,
例如,對于數列{pi}={5, 3, 8, 2, 9},Huffman樹的構造程序如下:
1. 找到{5, 3, 8, 2, 9}中最小的兩個數,分別是2和3,從{pi}中洗掉它們并將和5加入,得到{5, 8, 9, 5},費用為5,
2. 找到{5, 8, 9, 5}中最小的兩個數,分別是5和5,從{pi}中洗掉它們并將和10加入,得到{8, 9, 10},費用為10,
3. 找到{8, 9, 10}中最小的兩個數,分別是8和9,從{pi}中洗掉它們并將和17加入,得到{10, 17},費用為17,
4. 找到{10, 17}中最小的兩個數,分別是10和17,從{pi}中洗掉它們并將和27加入,得到{27},費用為27,
5. 現在,數列中只剩下一個數27,構造程序結束,總費用為5+10+17+27=59,輸入的第一行包含一個正整數n(n<=100),
接下來是n個正整數,表示p0, p1, …, pn-1,每個數不超過1000,輸出用這些數構造Huffman樹的總費用,
import java.util.*;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int n = input.nextInt();
List<Integer> list = new ArrayList<Integer>();
for (int i = 0; i < n; i++) {
int a = input.nextInt();
list.add(a);
}
boolean flag = true;
int sum = 0;
while (flag) {
if (list.size() < 2) {
System.out.println(sum);
flag = false;
} else {
int cc[] = new int[list.size()];
for (int i = 0; i < cc.length; i++) {
cc[i] = list.get(i);
}
Arrays.sort(cc);
int b = cc[0];
int c = cc[1];
list.remove(Integer.valueOf(b));
list.remove(Integer.valueOf(c));
int d = b + c;
sum += d;
list.add(d);
}
}
}
}

每周演算法練習
備戰藍橋杯 - Java演算法 (基礎練習一)
https://blog.csdn.net/m0_54925305/article/details/122367512
每日一悟:
你的現在很可能會是別人羨慕的明天
--托馬斯
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/413410.html
標籤:java







