第七届蓝桥杯省赛JavaC组真题——详细答案对照(完整版)
目錄
A、有獎猜謎
B、煤球數目
C、平方怪圈
D、骰子游戲
E、分小組
F、湊算式
G、搭積木
H、冰雹數
I、四平方和
J、密碼脫落
A、有獎猜謎
小明很喜歡猜謎語。
最近,他被邀請參加了X星球的猜謎活動。
每位選手開始的時候都被發給777個電子幣。
規則是:猜對了,手里的電子幣數目翻倍,
猜錯了,扣除555個電子幣, 扣完為止。
小明一共猜了15條謎語。
戰果為:vxvxvxvxvxvxvvx
其中v表示猜對了,x表示猜錯了。
請你計算一下,小明最后手里的電子幣數目是多少。
請填寫表示最后電子幣數目的數字。
注意:你提交的應該是一個整數,不要填寫任何多余的內容或說明性文字。
題解:
package demo;public class demo {public static void main(String[] args) {String string = "vxvxvxvxvxvxvvx";int start = 777; // 初始值int end = start; // 結束值for (int i = 0; i < string.length(); i++) {if (string.charAt(i) == 'v') {end *= 2;} else {end -= 555;}}System.out.println(end);} }B、煤球數目
有一堆煤球,堆成三角棱錐形。具體:
第一層放1個,
第二層3個(排列成三角形),
第三層6個(排列成三角形),
第四層10個(排列成三角形),
....
如果一共有100層,共有多少個煤球?
請填表示煤球總數目的數字。
注意:你提交的應該是一個整數,不要填寫任何多余的內容或說明性文字。
題解:
package demo;public class demo {public static void main(String[] args) {int an = 1;int sn = an;for (int i = 2; i <= 100; i++) {an += i;sn += an;}System.out.println(sn);} }C、平方怪圈
如果把一個正整數的每一位都平方后再求和,得到一個新的正整數。
對新產生的正整數再做同樣的處理。
如此一來,你會發現,不管開始取的是什么數字,
最終如果不是落入1,就是落入同一個循環圈。
請寫出這個循環圈中最大的那個數字。
請填寫該最大數字。
注意:你提交的應該是一個整數,不要填寫任何多余的內容或說明性文字。
題解:
package demo;import java.util.Scanner;public class demo {public static void main(String []args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();int sum = 0;int max = 0;for (int i = 1; i < 100; i++) {while (n != 0) {sum += Math.pow((n % 10), 2); n /= 10;}if (sum > max) {max = sum;}n = sum;sum = 0;}System.out.println(max);sc.close();} }D、骰子游戲
我們來玩一個游戲。
同時擲出3個普通骰子(6個面上的數字分別是1~6)。
如果其中一個骰子上的數字等于另外兩個的和,你就贏了。
下面的程序計算出你能獲勝的精確概率(以既約分數表示)
public class Main
{
? public static int gcd(int a, int b)
? {
? ? ? if(b==0) return a;
? ? ?return gcd(b,a%b);
? ? }
?public static void main(String[] args)
? ?{ ? ?
? ? ? ?int n = 0;
? ??? ? ? for(int i=0; i<6; i++)
? ??? ? ? for(int j=0; j<6; j++)
? ? ?for(int k=0; k<6; k++){
? ? ? ? ?if(________________________________) n++; ? //填空位置
? ? ? }
? ??
? ? ?int m = gcd(n,6*6*6);
? ? ? System.out.println(n/m + "/" + 6*6*6/m);
? ?}
}
仔細閱讀代碼,填寫劃線部分缺少的內容。
注意:不要填寫任何已有內容或說明性文字。
題解:
package demo;public class demo {public static int gcd(int a, int b) {if (b == 0)return a;return gcd(b, a % b);}public static void main(String[] args) {int n = 0;for (int i = 0; i < 6; i++)for (int j = 0; j < 6; j++)for (int k = 0; k < 6; k++) {if(i == j + k || j == i + k || k == i + j)n++; //填空位置}int m = gcd(n, 6 * 6 * 6); // 獲取最大公約數System.out.println(n / m + "/" + 6 * 6 * 6 / m); // 約分} }E、分小組
9名運動員參加比賽,需要分3組進行預賽。
有哪些分組的方案呢?
我們標記運動員為 A,B,C,... I
下面的程序列出了所有的分組方法。
該程序的正常輸出為:
ABC DEF GHI
ABC DEG FHI
ABC DEH FGI
ABC DEI FGH
ABC DFG EHI
ABC DFH EGI
ABC DFI EGH
ABC DGH EFI
ABC DGI EFH
ABC DHI EFG
ABC EFG DHI
ABC EFH DGI
ABC EFI DGH
ABC EGH DFI
ABC EGI DFH
ABC EHI DFG
ABC FGH DEI
ABC FGI DEH
ABC FHI DEG
ABC GHI DEF
ABD CEF GHI
ABD CEG FHI
ABD CEH FGI
ABD CEI FGH
ABD CFG EHI
ABD CFH EGI
ABD CFI EGH
ABD CGH EFI
ABD CGI EFH
ABD CHI EFG
ABD EFG CHI
..... (以下省略,總共560行)。
public class A
{
? ?public static String remain(int[] a)
? ?{
? ? ? ? ?String s = "";
? ?? ? ? ? for(int i=0; i<a.length; i++){
?? ? ? ? ? ?if(a[i] == 0) s += (char)(i+'A');
??? ? ? } ? ?
? ?? ? ?return s;
? ?}
?public static void f(String s, int[] a)
?{
? ? ?for(int i=0; i<a.length; i++){
?? ? ? ? ? ?if(a[i]==1) continue;
??? ? ? ? ? a[i] = 1;
? ?? ? ? ? ?for(int j=i+1; j<a.length; j++){
? ? ? ? ?? ? ? ?if(a[j]==1) continue;
? ? ? ? ?? ? ? ? a[j]=1;
? ? ? ?? ? ? ? ?for(int k=j+1; k<a.length; k++){
? ? ? ? ?? ? ? ? ? ?if(a[k]==1) continue;
? ? ? ??? ? ? ? ? ? a[k]=1;
? ? ? ?? ? ? ? ? ? ?System.out.println(__________________________________); ?//填空位置
? ? ? ??? ? ? ? ? ? a[k]=0;
? ? ? ??? ? ? ? }
? ? ? ??? ? ? ? a[j]=0;
? ?? ? ? ? ?}
? ?? ? ? ? ?a[i] = 0;
??? ? ? }
? ?}
?public static void main(String[] args)
? {
?? ? ? ?int[] a = new int[9]; ? ? ? ?
?? ? ? ?a[0] = 1;
? ??
? ? ?for(int b=1; b<a.length; b++){
? ?? ? ? ? ?a[b] = 1;
? ??? ? ? ? for(int c=b+1; c<a.length; c++){
? ??? ? ? ? ? ? a[c] = 1;
? ? ?? ? ? ? ? ?String s = "A" + (char)(b+'A') + (char)(c+'A');
? ? ?? ? ? ? ? ?f(s,a);
? ??? ? ? ? ? ? a[c] = 0;
??? ? ? ? ? }
? ? ?? ? ? ?a[b] = 0;
? ?? ? ?}
? }
}
仔細閱讀代碼,填寫劃線部分缺少的內容。
注意:不要填寫任何已有內容或說明性文字。
題解:
package demo;public class demo {public static String remain(int[] a) {String s = "";for (int i = 0; i < a.length; i++) {if (a[i] == 0)s += (char) (i + 'A');}return s;}public static void f(String s, int[] a) {for (int i = 0; i < a.length; i++) {if (a[i] == 1)continue;a[i] = 1;for (int j = i + 1; j < a.length; j++) {if (a[j] == 1)continue;a[j] = 1;for (int k = j + 1; k < a.length; k++) {if (a[k] == 1)continue;a[k] = 1;System.out.println(s + " " + (char) ('A' + i) + "" + (char) ('A' + j) + "" + (char) ('A' + k) + " "+ remain(a)); // 填空位置a[k] = 0;}a[j] = 0;}a[i] = 0;}}public static void main(String[] args) {int[] a = new int[9];a[0] = 1;// 前三個字符for (int b = 1; b < a.length; b++) {a[b] = 1;for (int c = b + 1; c < a.length; c++) {a[c] = 1;String s = "A" + (char) (b + 'A') + (char) (c + 'A');f(s, a);a[c] = 0;}a[b] = 0;}} }F、湊算式
(如果顯示有問題,可以參見上圖)
這個算式中A~I代表1~9的數字,不同的字母代表不同的數字。
比如:
6+8/3+952/714 就是一種解法,
5+3/1+972/486 是另一種解法。
這個算式一共有多少種解法?
注意:你提交應該是個整數,不要填寫任何多余的內容或說明性文字。
題解:
package demo;public class demo {public static void main(String[] args) {double[] arr = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };dfs(arr, 0, arr.length);System.out.println(count);}static int count = 0;public static void dfs(double[] arr, int start, int end) {if (start == end) {if (arr[0] + arr[1] / arr[2]+ (arr[3] * 100 + arr[4] * 10 + arr[5]) / (arr[6] * 100 + arr[7] * 10 + arr[8]) == 10) {count++;}}for (int i = start; i < end; i++) {double temp = arr[i];arr[i] = arr[start];arr[start] = temp;dfs(arr, start + 1, end);temp = arr[i];arr[i] = arr[start];arr[start] = temp;}} }G、搭積木
小明最近喜歡搭數字積木,
一共有10塊積木,每個積木上有一個數字,0~9。
搭積木規則:
每個積木放到其它兩個積木的上面,并且一定比下面的兩個積木數字小。
最后搭成4層的金字塔形,必須用完所有的積木。
下面是兩種合格的搭法:
? ?0
? 1 2
?3 4 5
6 7 8 9
? ?0
? 3 1?? ?
?7 5 2
9 8 6 4 ? ?
請你計算這樣的搭法一共有多少種?
請填表示總數目的數字。
注意:你提交的應該是一個整數,不要填寫任何多余的內容或說明性文字。
題解:
package demo;public class demo {public static void main(String[] args) {int[] arr = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };dfs(arr, 0, arr.length);System.out.println(count);}public static void dfs(int[] arr, int start, int end) {if (start == end) {check(arr);return;}for (int i = start; i < end; i++) {int temp = arr[i];arr[i] = arr[start];arr[start] = temp;dfs(arr, start + 1, end);temp = arr[i];arr[i] = arr[start];arr[start] = temp;}}static int count = 0;public static void check(int[] arr) {if (arr[0] > arr[1] || arr[0] > arr[2]) {return;}if (arr[1] > arr[3] || arr[1] > arr[4]) {return;}if (arr[2] > arr[4] || arr[2] > arr[5]) {return;}if (arr[3] > arr[6] || arr[3] > arr[7]) {return;}if (arr[4] > arr[7] || arr[4] > arr[8]) {return;}if (arr[5] > arr[8] || arr[5] > arr[9]) {return;}count++;} }H、冰雹數
任意給定一個正整數N,
如果是偶數,執行: N / 2
如果是奇數,執行: N * 3 + 1
生成的新的數字再執行同樣的動作,循環往復。
通過觀察發現,這個數字會一會兒上升到很高,
一會兒又降落下來。
就這樣起起落落的,但最終必會落到“1”
這有點像小冰雹粒子在冰雹云中翻滾增長的樣子。
比如N=9
9,28,14,7,22,11,34,17,52,26,13,40,20,10,5,16,8,4,2,1
可以看到,N=9的時候,這個“小冰雹”最高沖到了52這個高度。
輸入格式:
一個正整數N(N<1000000)
輸出格式:
一個正整數,表示不大于N的數字,經過冰雹數變換過程中,最高沖到了多少。
例如,輸入:
10
程序應該輸出:
52
再例如,輸入:
100
程序應該輸出:
9232
資源約定:
峰值內存消耗(含虛擬機) < 256M
CPU消耗 ?< 1000ms
請嚴格按要求輸出,不要畫蛇添足地打印類似:“請您輸入...” 的多余內容。
所有代碼放在同一個源文件中,調試通過后,拷貝提交該源碼。
注意:不要使用package語句。不要使用jdk1.7及以上版本的特性。
注意:主類的名字必須是:Main,否則按無效代碼處理。
題解:
package demo;import java.util.Scanner;public class demo {// 冰雹數public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();sc.close();long l[] = new long[1000001];for (int i = 2; i <= n; i++) {long t = i;long max = 0;while (t != 1) {if (t % 2 == 0) {t /= 2;if (t < 1000001 && l[(int) t] != 0) {l[i] = l[(int) t];break;}} else {t = t * 3 + 1;if (t > max)max = t;}}if (max > l[i - 1])l[i] = max;elsel[i] = l[i - 1];}System.out.println(l[n]);}}I、四平方和
四平方和定理,又稱為拉格朗日定理:
每個正整數都可以表示為至多4個正整數的平方和。
如果把0包括進去,就正好可以表示為4個數的平方和。
比如:
5 = 0^2 + 0^2 + 1^2 + 2^2
7 = 1^2 + 1^2 + 1^2 + 2^2
(^符號表示乘方的意思)
對于一個給定的正整數,可能存在多種平方和的表示法。
要求你對4個數排序:
0 <= a <= b <= c <= d
并對所有的可能表示法按 a,b,c,d 為聯合主鍵升序排列,最后輸出第一個表示法
程序輸入為一個正整數N (N<5000000)
要求輸出4個非負整數,按從小到大排序,中間用空格分開
例如,輸入:
5
則程序應該輸出:
0 0 1 2
再例如,輸入:
12
則程序應該輸出:
0 2 2 2
再例如,輸入:
773535
則程序應該輸出:
1 1 267 838
資源約定:
峰值內存消耗(含虛擬機) < 256M
CPU消耗 ?< 3000ms
請嚴格按要求輸出,不要畫蛇添足地打印類似:“請您輸入...” 的多余內容。
所有代碼放在同一個源文件中,調試通過后,拷貝提交該源碼。
注意:不要使用package語句。不要使用jdk1.7及以上版本的特性。
注意:主類的名字必須是:Main,否則按無效代碼處理。
題解:
package demo;import java.util.Scanner;public class demo {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();for (int i = 0; i < Math.sqrt(n); i++) {for (int j = 0; j < Math.sqrt(n - i * i); j++) {for (int k = 0; k < Math.sqrt(n - j * j); k++) {for (int m = 0; m < Math.sqrt(n - k * k); m++) {if (i * i + j * j + k * k + m * m == n) {System.out.println(i + " " + j + " " + k + " " + m + " ");return;}}}}}}}J、密碼脫落
X星球的考古學家發現了一批古代留下來的密碼。
這些密碼是由A、B、C、D 四種植物的種子串成的序列。
仔細分析發現,這些密碼串當初應該是前后對稱的(也就是我們說的鏡像串)。
由于年代久遠,其中許多種子脫落了,因而可能會失去鏡像的特征。
你的任務是:
給定一個現在看到的密碼串,計算一下從當初的狀態,它要至少脫落多少個種子,才可能會變成現在的樣子。
輸入一行,表示現在看到的密碼串(長度不大于1000)
要求輸出一個正整數,表示至少脫落了多少個種子。
例如,輸入:
ABCBA
則程序應該輸出:
0
再例如,輸入:
ABDCDCBABC
則程序應該輸出:
3
資源約定:
峰值內存消耗(含虛擬機) < 256M
CPU消耗 ?< 3000ms
請嚴格按要求輸出,不要畫蛇添足地打印類似:“請您輸入...” 的多余內容。
所有代碼放在同一個源文件中,調試通過后,拷貝提交該源碼。
注意:不要使用package語句。不要使用jdk1.7及以上版本的特性。
注意:主類的名字必須是:Main,否則按無效代碼處理。
題解:
package demo;import java.util.Scanner;public class demo {public static String A;public static String backA;public static int dfs(int lenA, int lenB) {if (lenA == -1 || lenB == -1)return 0;if (A.charAt(lenA) == backA.charAt(lenB))return dfs(lenA - 1, lenB - 1) + 1;elsereturn Math.max(dfs(lenA - 1, lenB), dfs(lenA, lenB - 1));}public static void main(String[] args) {Scanner sc = new Scanner(System.in);A = sc.nextLine();backA = "";for (int i = A.length() - 1; i >= 0; i--)backA += A.charAt(i);int result = A.length() - dfs(A.length() - 1, backA.length() - 1);System.out.println(result);}}總結
以上是生活随笔為你收集整理的第七届蓝桥杯省赛JavaC组真题——详细答案对照(完整版)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 第六届蓝桥杯JavaC组省赛真题——详细
- 下一篇: pmp每日三题(2022年3月4日)