第九届蓝桥杯省赛JavaC组真题——详细答案对照(完整版)
目錄
A、哪天返回
B、猴子分香蕉
C、字母陣列
?
D、第幾個幸運數
E、書號驗證
F、打印大X
?
G、縮位求和
?
H、等腰三角形
I、小朋友崇拜圈
?
J、耐摔指數
A、哪天返回
小明被不明勢力劫持。后被扔到x星站再無問津。小明得知每天都有飛船飛往地球,但需要108元的船票,而他卻身無分文。
他決定在x星戰打工。好心的老板答應包食宿,第1天給他1元錢。
并且,以后的每一天都比前一天多2元錢,直到他有足夠的錢買票。
請計算一下,小明在第幾天就能湊夠108元,返回地球。
題解:
package action;public class demo {public static void main(String[] args) {int an = 1;int sn = 0;int n=0;for (n = 0; sn < 108; n++) {sn += an;an += 2;}System.out.println(n);} }B、猴子分香蕉
5只猴子是好朋友,在海邊的椰子樹上睡著了。這期間,有商船把一大堆香蕉忘記在沙灘上離去。
第1只猴子醒來,把香蕉均分成5堆,還剩下1個,就吃掉并把自己的一份藏起來繼續睡覺。
第2只猴子醒來,重新把香蕉均分成5堆,還剩下2個,就吃掉并把自己的一份藏起來繼續睡覺。
第3只猴子醒來,重新把香蕉均分成5堆,還剩下3個,就吃掉并把自己的一份藏起來繼續睡覺。
第4只猴子醒來,重新把香蕉均分成5堆,還剩下4個,就吃掉并把自己的一份藏起來繼續睡覺。
第5只猴子醒來,重新把香蕉均分成5堆,哈哈,正好不剩!
請計算一開始最少有多少個香蕉。
題解:
package action;public class demo {public static void main(String[] args) {for (int n = 20;; n++) {double y = n; // 桃子的個數for (int x = 1; x <= 4; x++) {y = y - x - (y - x) / 5;}if (y % 5 == 0) {System.out.println(n);break;}}} }C、字母陣列
仔細尋找,會發現:在下面的8x8的方陣中,隱藏著字母序列:“LANQIAO”。
SLANQIAO
ZOEXCCGB
MOAYWKHI
BCCIPLJQ
SLANQIAO
RSFWFNYA
XIFZVWAL
COAIQNAL
我們約定: 序列可以水平,垂直,或者是斜向;
并且走向不限(實際上就是有一共8種方向)。
上圖中一共有4個滿足要求的串。
下面有一個更大的(100x100)的字母方陣。
你能算出其中隱藏了多少個“LANQIAO”嗎?
題解:
package action;import java.util.Scanner;public class demo {static int n = 100; // 長度static char[] ch = { 'L', 'A', 'N', 'Q', 'I', 'A', 'O' }; // 尋找數據static char[][] data = new char[n][n]; // 存儲字母方陣// 從正北方向繞順時針旋轉一圈的八個方向對應的增減值static int[] dx = { 0, 1, 1, 1, 0, -1, -1, -1 };static int[] dy = { 1, 1, 0, -1, -1, -1, 0, 1 };static int count = 0; // 計數public static void main(String[] args) {Scanner sc = new Scanner(System.in);// 插入數據for (int i = 0; i < data.length; i++) {data[i] = sc.nextLine().toCharArray();}// 循環for (int i = 0; i < data.length; i++) {for (int j = 0; j < data[i].length; j++) {// 找第一個字符Lif (data[i][j] == ch[0]) {sheck(i, j); // 查找方法}}}System.out.println(count); // 打印sc.close();}public static void sheck(int i, int j) {// 八個方向for (int d = 0; d < 8; d++) {int x = i + dx[d];int y = j + dy[d];int num = 1; // 尋找字符數組下標while (x < n && x >= 0 && y < n && y >= 0 && data[x][y] == ch[num]) {// 當測試到最后一個字母以后,計數+1,并跳出while循環,進行下一個方向的尋找if (num == 6) {count++;break;}num++; // 下一個// 對應坐標加上相應的dx,dyx += dx[d];y += dy[d];}}} }D、第幾個幸運數
到x星球旅行的游客都被發給一個整數,作為游客編號。x星的國王有個怪癖,他只喜歡數字3,5和7。
國王規定,游客的編號如果只含有因子:3,5,7,就可以獲得一份獎品。
我們來看前10個幸運數字是:3 5 7 9 15 21 25 27 35 45
因而第11個幸運數字是:49
小明領到了一個幸運數字 59084709587505,他去領獎的時候,人家要求他準確地說出這是第幾個幸運數字,否則領不到獎品。
請你幫小明計算一下,59084709587505是第幾個幸運數字。
題解:
package action;public class demo {public static void main(String[] args) {long y = 59084709587505l;int count = 0;for (int i = 0; Math.pow(3, i) < y; i++) {for (int j = 0; Math.pow(5, j) < y; j++) {for (int k = 0; Math.pow(7, k) < y; k++) {if (Math.pow(3, i) * Math.pow(5, j) * Math.pow(7, k) < y) {count++;System.out.println(count + " " + Math.pow(3, i) * Math.pow(5, j) * Math.pow(7, k));}}}}System.out.println(count);} }E、書號驗證
2004年起,國際ISBN中心出版了《13位國際標準書號指南》。
原有10位書號前加978作為商品分類標識;校驗規則也改變。
校驗位的加權算法與10位ISBN的算法不同,具體算法是:
用1分別乘ISBN的前12位中的奇數位(從左邊開始數起),用3乘以偶數位,
乘積之和以10為模,10與模值的差值再?? ?對10取模(即取個位的數字)即可得到校驗位的值,
其值范圍應該為0~9。
下面的程序實現了該算法,請仔細閱讀源碼,填寫缺失的部分。
public class A
{
static boolean f(String s){
int k=1;
int sum = 0;
for(int i=0; i<s.length(); i++){
char c = s.charAt(i);
if(c==’-’ || c==’ ') continue;
sum += ______________________________; //填空
k++;
if(k>12) break;
}
return s.charAt(s.length()-1)-‘0’ == (10-sum % 10)%10;
}
public static void main(String[] args){
System.out.println(f(“978-7-301-04815-3”));
System.out.println(f(“978-7-115-38821-6”));
}
}
題解:
package action;public class demo {static boolean f(String s) {int k = 1; // 位數int sum = 0; // 乘積之和for (int i = 0; i < s.length(); i++) {char c = s.charAt(i); // 獲取每個字符if (c == '-' || c == ' ')continue; // 跳轉杠和空格// (k % 2 == 0?3:1) : 判斷是否是奇數還是偶數,并且得到對應的乘值sum += (c - '0') * (k % 2 == 0 ? 3 : 1); // 填空位置k++; // 每次循環位數+1if (k > 12)break; // 超出12位直接跳出}// 乘積之和以10為模,10與模值的差值再對10取模(即取個位的數字)即可return s.charAt(s.length() - 1) - '0' == (10 - sum % 10) % 10;}public static void main(String[] args) {System.out.println(f("978-7-301-04815-3"));System.out.println(f("978-7-115-38821-6"));} }F、打印大X
如下的程序目的是在控制臺打印輸出大X。
可以控制兩個參數:圖形的高度,以及筆寬。
用程序中的測試數據輸出效果:
(如果顯示有問題,可以參看p1.png)
高度=15, 筆寬=3
高度=8, 筆寬=5
??
請仔細分析程序流程,填寫缺失的代碼。public class A { static void f(int h, int w){ System.out.println(String.format(“高度=%d, 筆寬=%d”,h,w)); int a1 = 0; int a2 = h - 1;for(int k=0; k<h; k++){ int p = Math.min(a1,a2); int q = Math.max(a1+w,a2+w);for(int i=0; i<p; i++) System.out.print(" ");if(q-p<w2){ ____________________________________________ ; //填空 } else{ for(int i=0; i<w; i++) System.out.print(""); for(int i=0; i<q-p-w2; i++) System.out.print(" “); for(int i=0; i<w; i++) System.out.print(”"); } System.out.println(); a1++; a2–; } }public static void main(String[] args){ f(15,3); f(8,5); } }注意:只填寫缺失的代碼,不要拷貝已經存在的代碼。題解:
package action;public class demo {static void f(int h, int w) {System.out.println(String.format("高度=%d, 筆寬=%d", h, w)); // 打印高度和寬度int a1 = 0; // 每一行第一個*的位置(上半部分)int a2 = h - 1; // 圖形的行數(上半部分)for (int k = 0; k < h; k++) {// 上下兩部分是對稱的,所以這里用最大值和最小值的方式可以起到對稱的效果int p = Math.min(a1, a2); // 每一行第一個*的位置int q = Math.max(a1 + w, a2 + w); // 每一行的長度// 左側空格部分for (int i = 0; i < p; i++) // 從0->p,即第一個*前都是空格System.out.print(" ");// 這一部分填空的位置,再沒有這個代碼打印的話,會發現就是中間那幾行*號的部分// 范圍就是它在if中的條件q-pif (q - p < w * 2) { for(int i=0; i<q-p; i++) System.out.print("*"); ; //填空} else {// 左側*號部分for (int i = 0; i < w; i++)System.out.print("*");// 上面和下面的空格部分for (int i = 0; i < q - p - w * 2; i++)System.out.print(" ");// 右側的*號部分for (int i = 0; i < w; i++)System.out.print("*");}System.out.println(); // 換行a1++;a2--;}}public static void main(String[] args) {f(15, 3);f(8, 5);} }G、縮位求和
在電子計算機普及以前,人們經常用一個粗略的方法來驗算四則運算是否正確。
比如:248 * 15 = 3720
把乘數和被乘數分別逐位求和,如果是多位數再逐位求和,直到是1位數,得
2 + 4 + 8 = 14 ==> 1 + 4 = 5;
1 + 5 = 6
5 * 6
而結果逐位求和為 3
5 * 6 的結果逐位求和與3符合,說明正確的可能性很大!!(不能排除錯誤)
請你寫一個計算機程序,對給定的字符串逐位求和:
輸入為一個由數字組成的串,表示n位數(n<1000);
輸出為一位數,表示反復逐位求和的結果。
例如:
輸入:
35379
程序應該輸出:
9
再例如:
輸入:
7583676109608471656473500295825
程序應該輸出:
1
資源約定:
峰值內存消耗(含虛擬機) < 256M
CPU消耗 ?< 1000ms
請嚴格按要求輸出,不要畫蛇添足地打印類似:“請您輸入...” 的多余內容。
所有代碼放在同一個源文件中,調試通過后,拷貝提交該源碼。
不要使用package語句。不要使用jdk1.7及以上版本的特性。
主類的名字必須是:Main,否則按無效代碼處理。
題解:
package action;import java.util.Scanner;public class demo {public static void main(String[] args) {Scanner sc = new Scanner(System.in);String str = sc.next(); // 輸入字符串char[] ch = str.toCharArray(); // 字符串轉換為字符數組while (true) {int num = 0; // 和for (int i = 0; i < ch.length; i++) {num += (ch[i] - '0'); // 每個字符加和}str = num + ""; // 將和變成字符串if (str.length() == 1) { // 判斷字符串長度System.out.println(str);break;}ch = str.toCharArray(); // 如果沒有跳出,則繼續將字符串切割成字符數組,繼續循環}} }H、等腰三角形
本題目要求你在控制臺輸出一個由數字組成的等腰三角形。
具體的步驟是:
1. 先用1,2,3,...的自然數拼一個足夠長的串
2. 用這個串填充三角形的三條邊。從上方頂點開始,逆時針填充。
比如,當三角形高度是8時:
? ?? ? ? 1
? ? ? 2 1
? ? ?3 ? 8
? ? 4 ? ? 1
? ?5 ? ? ? 7
? 6 ? ? ? ? 1
?7 ? ? ? ? ? 6
891011121314151
輸入,一個正整數n(3<n<300),表示三角形的高度
輸出,用數字填充的等腰三角形。
為了便于測評,我們要求空格一律用"."代替。
例如:
輸入:
5
程序應該輸出:
....1
...2.1
..3...2
.4.....1
567891011
再例如:
輸入:
10
程序應該輸出:
.........1
........2.2
.......3...2
......4.....2
.....5.......1
....6.........2
...7...........0
..8.............2
.9...............9
1011121314151617181
再例如:
輸入:
15
程序應該輸出:
..............1
.............2.3
............3...2
...........4.....3
..........5.......1
.........6.........3
........7...........0
.......8.............3
......9...............9
.....1.................2
....0...................8
...1.....................2
..1.......................7
.1.........................2
21314151617181920212223242526
資源約定:
峰值內存消耗(含虛擬機) < 256M
CPU消耗 ?< 1000ms
題解:
package action;import java.util.Scanner;public class demo {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int h = sc.nextInt(); // 高度int an = 1 + (h - 1 - 1) * 2; // 最下面一行需要的字符數int n = h + an + (h - 1); // 一圈所需要的字符數char[] ch = new char[n + 3]; // 長度加3個備用String numStr = ""; // 獲取所需字符for (int i = 1; numStr.length() < n + 3; i++) {numStr += String.valueOf(i);}ch = numStr.toCharArray(); // 變成字符// 打印for (int i = 1; i <= h; i++) {// 左側.號for (int j = h - i; j > 0; j--) {System.out.print(".");}System.out.print(ch[i - 1]); // 左側數字// 中間.號,這個運用等差數列可以獲得中間的空值,然后去打印if (i >= 2 && i < h) {for (int a = 0; a < 1 + (i - 1 - 1) * 2; a++) {System.out.print(".");}}// 最后一行if (i == h) {for (int j = 0; j < an; j++) {System.out.print(ch[h + j]);}}if (i != 1) {System.out.print(ch[n - i + 1]); // 右側數字}System.out.println();}} }I、小朋友崇拜圈
班里N個小朋友,每個人都有自己最崇拜的一個小朋友(也可以是自己)。
在一個游戲中,需要小朋友坐一個圈,
每個小朋友都有自己最崇拜的小朋友在他的右手邊。
求滿足條件的圈最大多少人?
小朋友編號為1,2,3,…N
輸入第一行,一個整數N(3<N<100000)
接下來一行N個整數,由空格分開。
要求輸出一個整數,表示滿足條件的最大圈的人數。
例如:
輸入:
9
3 4 2 5 3 8 4 6 9
則程序應該輸出:
4
解釋:
如圖p1.png所示,崇拜關系用箭頭表示,紅色表示不在圈中。
顯然,最大圈是[2 4 5 3] 構成的圈
再例如:
輸入:
30
22 28 16 6 27 21 30 1 29 10 9 14 24 11 7 2 8 5 26 4 12 3 25 18 20 19 23 17 13 15
程序應該輸出:
16
資源約定:
峰值內存消耗(含虛擬機) < 256M
CPU消耗 < 1000ms
題解:
package action;import java.util.ArrayList; import java.util.Scanner;public class demo {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();int[] arr = new int[n];for (int i = 0; i < arr.length; i++) {arr[i] = sc.nextInt();}// 循環數組,每個num代表的是這個小朋友崇拜的人int max = 0; // 最大的圈中人數for (int num : arr) {ArrayList<Integer> list = new ArrayList<Integer>(); // 儲存圈中人數int count = 0; // 以每一個為起點得到的圈中個數int temp = num; // 臨時變量// 判斷這個小朋友崇拜的人是否在list集合中,存在則圈停止結束,不存在則繼續while (!list.contains(temp)) {list.add(temp); // 添加小朋友崇拜的人到集合中temp = arr[temp - 1]; // 找到當前小朋友崇拜的人,繼續循環count++; // 圈中人數+1if (count > max) { // 比較替換最大的圈中人數max = count;}}}System.out.println(max);} }?
兩個數據都通過。?
J、耐摔指數
x星球的居民脾氣不太好,但好在他們生氣的時候唯一的異常舉動是:摔手機。
各大廠商也就紛紛推出各種耐摔型手機。x星球的質監局規定了手機必須經過耐摔測試,并且評定出一個耐摔指數?? ?來,之后才允許上市流通。
x星球有很多高聳入云的高塔,剛好可以用來做耐摔測試。塔的每一層高度都是一樣的,與地球上稍有不同的是,他們的第一層不是地面,而是相當于我們的2樓。
如果手機從第7層扔下去沒摔壞,但第8層摔壞了,則手機耐摔指數=7。
特別地,如果手機從第1層扔下去就壞了,則耐摔指數=0。
如果到了塔的最高層第n層扔沒摔壞,則耐摔指數=n
為了減少測試次數,從每個廠家抽樣3部手機參加測試。
如果已知了測試塔的高度,并且采用最佳策略,在最壞的運氣下最多需要測試多少次才能確定手機的耐摔指數呢?
輸入數據,一個整數n(3<n<10000),表示測試塔的高度。
輸出一個整數,表示最多測試多少次。
例如:
輸入:
3
程序應該輸出:
2
解釋:
手機a從2樓扔下去,壞了,就把b手機從1樓扔;否則a手機繼續3層扔下
再例如:
輸入:
7
程序應該輸出:
3
解釋:
a手機從4層扔,壞了,則下面有3層,b,c 兩部手機2次足可以測出指數;
若是沒壞,手機充足,上面5,6,7 三層2次也容易測出。
資源約定:
峰值內存消耗(含虛擬機) < 256M
CPU消耗 < 1000ms
請嚴格按要求輸出,不要畫蛇添足地打印類似:“請您輸入…” 的多余內容。
題解:
package action;import java.util.Scanner;public class demo {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();int[] x = new int[1000];int sum = 1;for (int i = 0; sum < n; i++) {sum = i + sum;x[i] = sum;}sum = 1;int k = 0;for (int i = 0; sum < n; i++) {sum = x[i] + sum;k++;}System.out.println(k);} }兩個測試數據都過了。
總結
以上是生活随笔為你收集整理的第九届蓝桥杯省赛JavaC组真题——详细答案对照(完整版)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: pmp每日三题(2022年3月4日)
- 下一篇: 第十届蓝桥杯省赛JavaC组真题——详细