第六届省赛(软件类)真题----Java大学C组答案及解析
第六屆省賽(軟件類)真題----Java大學C組答案及解析
一、隔行變色
Excel表的格子很多,為了避免把某行的數據和相鄰行混淆,可以采用隔行變色的樣式。
小明設計的樣式為:第1行藍色,第2行白色,第3行藍色,第4行白色,....
現在小明想知道,從第21行到第50行一共包含了多少個藍色的行。
請你直接提交這個整數,千萬不要填寫任何多余的內容。
答案:15
二、立方尾
有些數字的立方的末尾正好是該數字本身。
比如:1,4,5,6,9,24,25,....
請你計算一下,在10000以內的數字中(指該數字,并非它立方后的數值),符合這個特征的正整數一共有多少個。
請提交該整數,不要填寫任何多余的內容。
答案:36
解析:特別注意存4000+的三次方不能用int
三、無窮分數
無窮的分數,有時會趨向于固定的數字。
請計算【圖1.jpg】所示的無窮分數,要求四舍五入,精確到小數點后5位,小數位不足的補0。
請填寫該浮點數,不能填寫任何多余的內容。
答案:0.58198
四、循環節長度
兩個整數做除法,有時會產生循環小數,其循環部分稱為:循環節。
比如,11/13=6=>0.846153846153.....? 其循環節為[846153] 共有6位。
下面的方法,可以求出循環節的長度。
請仔細閱讀代碼,并填寫劃線部分缺少的代碼。
通過看每次計算的余數是否與之前相等,來判斷循環節長度的。因為余數一旦相等,乘以十后除以除數也必然相等。
答案:v.size()-v.indexOf(n)
五、格子中輸出★
stringInGrid方法會在一個指定大小的格子中打印指定的字符串。
要求字符串在水平、垂直兩個方向上都居中。
如果字符串太長,就截斷。
如果不能恰好居中,可以稍稍偏左或者偏上一點。
下面的程序實現這個邏輯,請填寫劃線部分缺少的代碼。
答案:"%"+(width-s.length()-2)/2+"s%s%"+((width-s.length()-2)/2)+"s"
解析:格式化輸出問題
六、奇妙的數字
小明發現了一個奇妙的數字。它的平方和立方正好把0~9的10個數字每個用且只用了一次。
你能猜出這個數字是多少嗎?
請填寫該數字,不要填寫任何多余的內容。
答案:69
解析:如何判斷十個數都存在?使用set判斷長度
七、加法變乘法
我們都知道:1+2+3+ ... + 49 = 1225
現在要求你把其中兩個不相鄰的加號變成乘號,使得結果為2015
比如:
1+2+3+...+10*11+12+...+27*28+29+...+49 = 2015
就是符合要求的答案。
請你尋找另外一個可能的答案,并把位置靠前的那個乘號左邊的數字提交(對于示例,就是提交10)。
注意:需要你提交的是一個整數,不要填寫任何多余的內容。
答案:16
八、移動距離
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,否則按無效代碼處理。
解析:代碼上面注釋部分是一開始用數組存儲的代碼,其實根本不需要創建數組的,只要找到兩棟樓房的坐標即可,這樣可以輕松求出兩棟樓房的距離。
九、打印大X★
小明希望用星號拼湊,打印出一個大X,他要求能夠控制筆畫的寬度和整個字的高度。
為了便于比對空格,所有的空白位置都以句點符來代替。
要求輸入兩個整數m n,表示筆的寬度,X的高度。用空格分開(0<m<n, 3<n<1000, 保證n是奇數)
要求輸出一個大X
例如,用戶輸入:
3 9
程序應該輸出:
再例如,用戶輸入:
4 21
程序應該輸出
資源約定:
峰值內存消耗(含虛擬機) < 256M
CPU消耗? < 1000ms
請嚴格按要求輸出,不要畫蛇添足地打印類似:“請您輸入...” 的多余內容。
所有代碼放在同一個源文件中,調試通過后,拷貝提交該源碼。
注意:不要使用package語句。不要使用jdk1.7及以上版本的特性。
注意:主類的名字必須是:Main,否則按無效代碼處理。
解析:不得不說這是我迄今為止看到最為奇妙的代碼了,我本來的思路是分成上下兩部分打印符號,但是下面的代碼直接控制每行的內容就巧妙的實現了同樣的效果
我們對于每一行都能劃分成這五部分,也就是打印“.”和“*”交替進行,那么只要我們確定好什么時候開始什么時候停止就可以了,下面的就是四個臨界條件。這里注意打印的寬度為n+m-1,后面兩個條件的給出需要借助寬度。
import java.util.Scanner;public class Main2 {public static void main(String[] args) {Scanner in = new Scanner(System.in);int m = in.nextInt();int n = in.nextInt();for (int i = 1; i <= n; i++){for (int j = 1; j <= n + m - 1;j++){/*** i-1 m+(i-1)+1 (n+m-1)-(m+(i-1)+1)+1 (n+m-1) - (i-1) + 1* */if ((j>i - 1) && (j < m+(i-1)+1) || (j >(n+m-1)-(m+(i-1)+1)+1) && (j<(n+m-1) - (i-1) + 1))System.out.print("*");elseSystem.out.print(".");}System.out.println();}} }十、壘骰子★★
賭圣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,否則按無效代碼處理。
解析:題目難點在于想到使用矩陣存放數據,想到這種方法之后還要懂得如何求矩陣快速冪,不然肯定是會超時的。
關于矩陣快速冪可以參考下面的文章斐波那契數列(二)--矩陣優化算法
import java.util.Scanner;public class Main {static final double MOD = 10e9-7;static int[][] arr = new int[6][6];public static void main(String[] args) {Scanner input = new Scanner(System.in);int n = input.nextInt();int m = input.nextInt();/*** 初始化arr數組* */for (int i = 0; i < 6; i++) {for (int j = 0; j < 6; j++) {arr[i][j] = 1;}}for (int i = 0; i < m; i++) {int a = input.nextInt();int b = input.nextInt();arr[a-1][b-1] = 0;arr[b-1][a-1] = 0;}/**** */int[][] ans = pow(arr, n-1);int sum = 0;for (int i = 0; i < 6; i++) {for (int j = 0; j < 6; j++) {sum += ans[i][j]%MOD;}}/*** 旋轉情況 4^n* */sum *= Math.pow(4, n)%MOD;System.out.println((int)(sum%MOD));}private static int[][] pow(int[][] arr, int k) {/*** 單位矩陣* */int[][] ans = new int[6][6];for (int i = 0; i < 6; i++) {ans[i][i] = 1;}/*** 矩陣快速冪核心算法* */while (k != 0) {if (k % 2 != 0) {ans = Multiply(arr, ans);}/*** 每次算多加一顆骰子,這樣算比單純n次相乘要快* */arr = Multiply(arr, arr);k >>= 1;}return ans;}private static int[][] Multiply(int[][] m, int[][] n) { // 標準計算矩陣乘法算法int rows = m.length;int cols = n[0].length;int[][] r = new int[rows][cols];for (int i = 0; i < rows; i++) {for (int j = 0; j < cols; j++) {for (int k = 0; k < m[i].length; k++) {r[i][j] += (m[i][k] * n[k][j])%MOD;}}}return r;} }總結
以上是生活随笔為你收集整理的第六届省赛(软件类)真题----Java大学C组答案及解析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JSP的三个编译指令-page,incl
- 下一篇: jQuery教程03-jQuery 元素