第六届蓝桥杯JavaC组省赛真题——详细答案对照(包含垒骰子)
A、隔行變色
Excel表的格子很多,為了避免把某行的數據和相鄰行混淆,可以采用隔行變色的樣式。
小明設計的樣式為:第1行藍色,第2行白色,第3行藍色,第4行白色,....
現在小明想知道,從第21行到第50行一共包含了多少個藍色的行。
請你直接提交這個整數,千萬不要填寫任何多余的內容。
題解:
package demo;public class demo {public static void main(String[] args) {int color = 0;for (int i = 21; i <= 50; i++) {if (i % 2 != 0) {color++;}}System.out.println(color);} }B、立方尾不變
有些數字的立方的末尾正好是該數字本身。
比如:1,4,5,6,9,24,25,....
請你計算一下,在10000以內的數字中(指該數字,并非它立方后的數值),符合這個特征的正整數一共有多少個。
請提交該整數,不要填寫任何多余的內容。
題解:
package demo;public class demo {public static void main(String[] args) {int count = 0;for (int i = 1; i <= 10000; i++) {String x = i + "";String cudb = cudb(i) + "";// 切割立方數最后相應幾位String y = cudb.substring(cudb.length() - x.length());// 判斷是否相同if (y.equals(x)) {count++;}}System.out.println(count);}/*** @param x* @return*/public static long cudb(int x) {return (long)Math.pow(x, 3);} }C、無窮分數
無窮的分數,有時會趨向于固定的數字。
請計算【圖1.jpg】所示的無窮分數,要求四舍五入,精確到小數點后5位,小數位不足的補0。
請填寫該浮點數,不能填寫任何多余的內容。
?題解:
package demo;public class demo {public static void main(String[] args) {System.out.println(String.format("%.5f", dfs(1, 10)));}/*** 遞歸求無窮級數* @param n* @param end* @return*/public static double dfs(int n, int end) {if (n == end) {return n;}return n / (n + dfs(n + 1, end));} }D、循環節長度
兩個整數做除法,有時會產生循環小數,其循環部分稱為:循環節。
比如,11/13=6=>0.846153846153..... ?其循環節為[846153] 共有6位。
下面的方法,可以求出循環節的長度。
請仔細閱讀代碼,并填寫劃線部分缺少的代碼。
?? ?public static int f(int n, int m)
?? ?{
?? ??? ?n = n % m;?? ?
?? ??? ?Vector v = new Vector();
?? ??? ?
?? ??? ?for(;;)
?? ??? ?{
?? ??? ??? ?v.add(n);
?? ??? ??? ?n *= 10;
?? ??? ??? ?n = n % m;
?? ??? ??? ?if(n==0) return 0;
?? ??? ??? ?if(v.indexOf(n)>=0) ?_________________________________ ; ?//填空
?? ??? ?}
?? ?}
注意,只能填寫缺少的部分,不要重復抄寫已有代碼。不要填寫任何多余的文字。
?
題解:
package demo;public class demo {public static void main(String[] args) {System.out.println(f(11, 13));}public static int f(int n, int m) {n = n % m;System.out.println(n);java.util.Vector v = new java.util.Vector();for (;;) {v.add(n); // 將n添加到Vector中n *= 10; // 將n放大System.out.println(n); // 測試打印n = n % m; // 繼續取余System.out.println(n); // 測試打印if (n == 0)return 0;if (v.indexOf(n) >= 0) {return v.size(); // 填空}}} }E、格子中輸出
stringInGrid方法會在一個指定大小的格子中打印指定的字符串。
要求字符串在水平、垂直兩個方向上都居中。
如果字符串太長,就截斷。
如果不能恰好居中,可以稍稍偏左或者偏上一點。
下面的程序實現這個邏輯,請填寫劃線部分缺少的代碼。
?? ?public static void stringInGrid(int width, int height, String s){if(s.length()>width-2) s = s.substring(0,width-2);System.out.print("+");for(int i=0;i<width-2;i++) System.out.print("-");System.out.println("+");for(int k=1; k<(height-1)/2;k++){System.out.print("|");for(int i=0;i<width-2;i++) System.out.print(" ");System.out.println("|");}System.out.print("|");String ff = ____________________________填空位置___________________________; ?//填空System.out.print(String.format(ff,"",s,""));System.out.println("|");for(int k=(height-1)/2+1; k<height-1; k++){System.out.print("|");for(int i=0;i<width-2;i++) System.out.print(" ");System.out.println("|");}?? ?System.out.print("+");for(int i=0;i<width-2;i++) System.out.print("-");System.out.println("+");?? ?}對于題目中數據,應該輸出:
題解:
package demo;public class demo {public static void main(String[] args) {paixu(15, 15, "hhf");}/*** @param width* @param height* @param s*/public static void paixu(int width, int height, String s) {// 第一行+號和-號if (s.length() > width - 2)s = s.substring(0, width - 2);System.out.print("+");for (int i = 0; i < width - 2; i++)System.out.print("-");System.out.println("+");// 上半部分的|號for (int k = 1; k < (height - 1) / 2; k++) {System.out.print("|");for (int i = 0; i < width - 2; i++)System.out.print(" ");System.out.println("|");}System.out.print("|"); // 字符串前面的|號String ff = "%" + (width - s.length() - 2) / 2 + "s%s%" + (width - s.length() - 2) / 2 + "s"; // 填空System.out.print(String.format(ff, "", s, ""));System.out.println("|"); // 字符串后面的|號// 下半部分的|號for (int k = (height - 1) / 2 + 1; k < height - 1; k++) {System.out.print("|");for (int i = 0; i < width - 2; i++)System.out.print(" ");System.out.println("|");}// 最后一行System.out.print("+");for (int i = 0; i < width - 2; i++)System.out.print("-");System.out.println("+");} }F、奇妙的數字
小明發現了一個奇妙的數字。它的平方和立方正好把0~9的10個數字每個用且只用了一次。
你能猜出這個數字是多少嗎?
請填寫該數字,不要填寫任何多余的內容。
題解:
package demo;import java.util.HashSet;public class demo {public static void main(String[] args) {for (int i = 40; i < 100; i++) {// 求一個數的平方和立方并存儲并合并到一個字符串中String str = (long)Math.pow(i, 2)+""+(long)Math.pow(i, 3);HashSet<Character> set = new HashSet<Character>(); // 存儲字符串的每一個字符// 插入數據for (int j = 0; j < str.length(); j++) {set.add(str.charAt(j));}// 判斷長度是否為10if (set.size() != 10) {continue;} else {System.out.println(i);}}} }G、加法變乘法
我們都知道:1+2+3+ ... + 49 = 1225
現在要求你把其中兩個不相鄰的加號變成乘號,使得結果為2015
比如:
1+2+3+...+10*11+12+...+27*28+29+...+49 = 2015
就是符合要求的答案。
請你尋找另外一個可能的答案,并把位置靠前的那個乘號左邊的數字提交(對于示例,就是提交10)。
注意:需要你提交的是一個整數,不要填寫任何多余的內容。
題解:
package demo;public class demo {public static void main(String[] args) {for (int i = 0; i < 47; i++) {for (int j = i + 2; j < 49; j++) {if (1225 + i * i + j * j == 2015 + (i + 1) + (j + 1)) {System.out.println(i);}}}} }H、移動距離
X星球居民小區的樓房全是一樣的,并且按矩陣樣式排列。其樓房的編號為1,2,3...
當排滿一行時,從下一行相鄰的樓往反方向排號。
比如:當小區排號寬度為6時,開始情形如下:
1 ?2 ?3 ?4 ?5 ?6
12 11 10 9 ?8 ?7
13 14 15 .....
我們的問題是:已知了兩個樓號m和n,需要求出它們之間的最短移動距離(不能斜線方向移動)
輸入為3個整數w m n,空格分開,都在1到10000范圍內
要求輸出一個整數,表示m n 兩樓間最短移動距離。
例如:
用戶輸入:
6 8 2
則,程序應該輸出:
4
再例如:
用戶輸入:
4 7 20
則,程序應該輸出:
5
資源約定:
峰值內存消耗(含虛擬機) < 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 w = sc.nextInt();int m = sc.nextInt();int n = sc.nextInt();// 第一個數字int x1 = ((m - 1) / w) + 1; // 行數int y1 = 0;if (x1 % 2 != 0) { // 判斷奇偶性y1 = m - (x1 - 1) * w;} else {y1 = w - (m - (w + 1));}// 第二個數字int x2 = ((n - 1) / w) + 1; // 行數int y2 = 0;if (x2 % 2 != 0) { // 判斷奇偶性y2 = n - (x2 - 1) * w;} else {y2 = w - (n - (w + 1));}System.out.println(Math.abs(x2 - x1) + Math.abs(y2 - y1));sc.close();} }I、打印大X
小明希望用星號拼湊,打印出一個大X,他要求能夠控制筆畫的寬度和整個字的高度。
為了便于比對空格,所有的空白位置都以句點符來代替。
要求輸入兩個整數m n,表示筆的寬度,X的高度。用空格分開(0<m<n, 3<n<1000, 保證n是奇數)
要求輸出一個大X
例如,用戶輸入:
3 9
程序應該輸出:
***.....***
.***...***.
..***.***..
...*****...
....***....
...*****...
..***.***..
.***...***.
***.....***
(如有對齊問題,參看【圖1.jpg】)
資源約定:
峰值內存消耗(含虛擬機) < 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 x = sc.nextInt();int y = sc.nextInt();char[][] arr = new char[y][y + x - 1];// 給數組賦值.for (int i = 0; i < arr.length; i++) {for (int j = 0; j < arr[i].length; j++) {arr[i][j] = '.';}}// 從左上到右下for (int i = 0; i < arr.length; i++) {for (int j = i; j < i + x; j++) {arr[i][j] = '*';}}// 從右上到坐下for (int i = 0; i < arr.length; i++) {for (int j = arr[i].length - i - 1; j > arr[i].length - i - 1 - x; j--) {arr[i][j] = '*';}}// 打印for (int i = 0; i < arr.length; i++) {for (int j = 0; j < arr[i].length; j++) {System.out.print(arr[i][j]);}System.out.println();}sc.close();} }J、壘骰子
賭圣atm晚年迷戀上了壘骰子,就是把骰子一個壘在另一個上邊,不能歪歪扭扭,要壘成方柱體。
經過長期觀察,atm 發現了穩定骰子的奧秘:有些數字的面貼著會互相排斥!
我們先來規范一下骰子:1 的對面是 4,2 的對面是 5,3 的對面是 6。
假設有 m 組互斥現象,每組中的那兩個數字的面緊貼在一起,骰子就不能穩定的壘起來。 atm想計算一下有多少種不同的可能的壘骰子方式。
兩種壘骰子方式相同,當且僅當這兩種方式中對應高度的骰子的對應數字的朝向都相同。
由于方案數可能過多,請輸出模 10^9 + 7 的結果。
不要小看了 atm 的骰子數量哦~
「輸入格式」
第一行兩個整數 n m
n表示骰子數目
接下來 m 行,每行兩個整數 a b ,表示 a 和 b 不能緊貼在一起。
「輸出格式」
一行一個數,表示答案模 10^9 + 7 的結果。
「樣例輸入」
2 1
1 2
「樣例輸出」
544
「數據范圍」
對于 30% 的數據:n <= 5
對于 60% 的數據:n <= 100
對于 100% 的數據:0 < n <= 10^9, m <= 36
資源約定:
峰值內存消耗(含虛擬機) < 256M
CPU消耗 ?< 2000ms
請嚴格按要求輸出,不要畫蛇添足地打印類似:“請您輸入...” 的多余內容。
所有代碼放在同一個源文件中,調試通過后,拷貝提交該源碼。
注意:不要使用package語句。不要使用jdk1.7及以上版本的特性。
注意:主類的名字必須是:Main,否則按無效代碼處理。
題解:
package demo;import java.util.Arrays; import java.util.Scanner;public class demo {static int mod = (int) 1e9 + 7;// 壘骰子public static void main(String[] args) {int d[] = new int[7]; // 篩子相對的點數d[1] = 4;d[4] = 1;d[2] = 5;d[5] = 2;d[3] = 6;d[6] = 3;boolean b[][] = new boolean[7][7];// 互斥數對Scanner sc = new Scanner(System.in);Long n = sc.nextLong();// 骰子數int m = sc.nextInt();// m組互斥for (int i = 0; i < m; i++) {// 接收互斥數對int p = sc.nextInt();int q = sc.nextInt();b[p][q] = true;b[q][p] = true;}sc.close();// 滾動賦值的dp狀態數組int dp[][] = new int[2][7];// dp[i][j]表示某一高度的骰子j面朝上的方案書Arrays.fill(dp[0], 1);// 當骰子高度為1時方案數為1的初始值, 實際是每個面*4 最后乘上long num = (long) Math.pow(4, n) % mod;// 每個點數朝上的方案數有4種 上下為軸,橫向旋轉骰子,每個面都乘4int t = 0;// temp翻轉數for (long h = 2; h <= n; h++) {// 遍歷骰子高度t = 1 - t;// 0 1反轉 數組滾動 1 0 1for (int a = 1; a < 7; a++) {// 遍歷骰子的每個面for (int k = 1; k < 7; k++) {// 遍歷上一個骰子的六個面// 判斷當前骰子的下面 和下面骰子的上面是否互斥if (!b[k][d[a]]) {// 如果不互斥的話,k為下面骰子某個點朝上 然后 d[a]為當前骰子朝上的對立面dp[t][a] += dp[1 - t][k];// 狀態轉移 當前骰子的a個面 加上上一個骰子的k面 面數疊加最后每個面乘上4^n次方}}dp[t][a] %= mod;// 無效優化 空間換時間,直接long就完了}}long count = 0;for (int i = 0; i < dp[0].length; i++) {// 遍歷疊加count = (count + dp[t][i]) % mod;}System.out.println((count * num) % mod);// 溢出值} }總結
以上是生活随笔為你收集整理的第六届蓝桥杯JavaC组省赛真题——详细答案对照(包含垒骰子)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: pmp每日三题(2022年3月2日)
- 下一篇: 第七届蓝桥杯省赛JavaC组真题——详细