第六届省赛(软件类)真题----Java大学C组答案及解析
第六屆省賽(軟件類)真題----Java大學(xué)C組答案及解析
一、隔行變色
Excel表的格子很多,為了避免把某行的數(shù)據(jù)和相鄰行混淆,可以采用隔行變色的樣式。
小明設(shè)計的樣式為:第1行藍(lán)色,第2行白色,第3行藍(lán)色,第4行白色,....
現(xiàn)在小明想知道,從第21行到第50行一共包含了多少個藍(lán)色的行。
請你直接提交這個整數(shù),千萬不要填寫任何多余的內(nèi)容。
答案:15
二、立方尾
有些數(shù)字的立方的末尾正好是該數(shù)字本身。
比如:1,4,5,6,9,24,25,....
請你計算一下,在10000以內(nèi)的數(shù)字中(指該數(shù)字,并非它立方后的數(shù)值),符合這個特征的正整數(shù)一共有多少個。
請?zhí)峤辉撜麛?shù),不要填寫任何多余的內(nèi)容。
答案:36
解析:特別注意存4000+的三次方不能用int
三、無窮分?jǐn)?shù)
無窮的分?jǐn)?shù),有時會趨向于固定的數(shù)字。
請計算【圖1.jpg】所示的無窮分?jǐn)?shù),要求四舍五入,精確到小數(shù)點后5位,小數(shù)位不足的補0。
請?zhí)顚懺摳↑c數(shù),不能填寫任何多余的內(nèi)容。
答案:0.58198
四、循環(huán)節(jié)長度
兩個整數(shù)做除法,有時會產(chǎn)生循環(huán)小數(shù),其循環(huán)部分稱為:循環(huán)節(jié)。
比如,11/13=6=>0.846153846153.....? 其循環(huán)節(jié)為[846153] 共有6位。
下面的方法,可以求出循環(huán)節(jié)的長度。
請仔細(xì)閱讀代碼,并填寫劃線部分缺少的代碼。
通過看每次計算的余數(shù)是否與之前相等,來判斷循環(huán)節(jié)長度的。因為余數(shù)一旦相等,乘以十后除以除數(shù)也必然相等。
答案:v.size()-v.indexOf(n)
五、格子中輸出★
stringInGrid方法會在一個指定大小的格子中打印指定的字符串。
要求字符串在水平、垂直兩個方向上都居中。
如果字符串太長,就截斷。
如果不能恰好居中,可以稍稍偏左或者偏上一點。
下面的程序?qū)崿F(xiàn)這個邏輯,請?zhí)顚憚澗€部分缺少的代碼。
答案:"%"+(width-s.length()-2)/2+"s%s%"+((width-s.length()-2)/2)+"s"
解析:格式化輸出問題
六、奇妙的數(shù)字
小明發(fā)現(xiàn)了一個奇妙的數(shù)字。它的平方和立方正好把0~9的10個數(shù)字每個用且只用了一次。
你能猜出這個數(shù)字是多少嗎?
請?zhí)顚懺摂?shù)字,不要填寫任何多余的內(nèi)容。
答案:69
解析:如何判斷十個數(shù)都存在?使用set判斷長度
七、加法變乘法
我們都知道:1+2+3+ ... + 49 = 1225
現(xiàn)在要求你把其中兩個不相鄰的加號變成乘號,使得結(jié)果為2015
比如:
1+2+3+...+10*11+12+...+27*28+29+...+49 = 2015
就是符合要求的答案。
請你尋找另外一個可能的答案,并把位置靠前的那個乘號左邊的數(shù)字提交(對于示例,就是提交10)。
注意:需要你提交的是一個整數(shù),不要填寫任何多余的內(nèi)容。
答案:16
八、移動距離
X星球居民小區(qū)的樓房全是一樣的,并且按矩陣樣式排列。其樓房的編號為1,2,3...
當(dāng)排滿一行時,從下一行相鄰的樓往反方向排號。
比如:當(dāng)小區(qū)排號寬度為6時,開始情形如下:
1? 2? 3? 4? 5? 6
12 11 10 9? 8? 7
13 14 15 .....
我們的問題是:已知了兩個樓號m和n,需要求出它們之間的最短移動距離(不能斜線方向移動)
輸入為3個整數(shù)w m n,空格分開,都在1到10000范圍內(nèi)
要求輸出一個整數(shù),表示m n 兩樓間最短移動距離。
例如:
用戶輸入:
6 8 2
則,程序應(yīng)該輸出:
4
再例如:
用戶輸入:
4 7 20
則,程序應(yīng)該輸出:
5
資源約定:
峰值內(nèi)存消耗(含虛擬機) < 256M
CPU消耗? < 1000ms
請嚴(yán)格按要求輸出,不要畫蛇添足地打印類似:“請您輸入...” 的多余內(nèi)容。
所有代碼放在同一個源文件中,調(diào)試通過后,拷貝提交該源碼。
注意:不要使用package語句。不要使用jdk1.7及以上版本的特性。
注意:主類的名字必須是:Main,否則按無效代碼處理。
解析:代碼上面注釋部分是一開始用數(shù)組存儲的代碼,其實根本不需要創(chuàng)建數(shù)組的,只要找到兩棟樓房的坐標(biāo)即可,這樣可以輕松求出兩棟樓房的距離。
九、打印大X★
小明希望用星號拼湊,打印出一個大X,他要求能夠控制筆畫的寬度和整個字的高度。
為了便于比對空格,所有的空白位置都以句點符來代替。
要求輸入兩個整數(shù)m n,表示筆的寬度,X的高度。用空格分開(0<m<n, 3<n<1000, 保證n是奇數(shù))
要求輸出一個大X
例如,用戶輸入:
3 9
程序應(yīng)該輸出:
再例如,用戶輸入:
4 21
程序應(yīng)該輸出
資源約定:
峰值內(nèi)存消耗(含虛擬機) < 256M
CPU消耗? < 1000ms
請嚴(yán)格按要求輸出,不要畫蛇添足地打印類似:“請您輸入...” 的多余內(nèi)容。
所有代碼放在同一個源文件中,調(diào)試通過后,拷貝提交該源碼。
注意:不要使用package語句。不要使用jdk1.7及以上版本的特性。
注意:主類的名字必須是:Main,否則按無效代碼處理。
解析:不得不說這是我迄今為止看到最為奇妙的代碼了,我本來的思路是分成上下兩部分打印符號,但是下面的代碼直接控制每行的內(nèi)容就巧妙的實現(xiàn)了同樣的效果
我們對于每一行都能劃分成這五部分,也就是打印“.”和“*”交替進(jìn)行,那么只要我們確定好什么時候開始什么時候停止就可以了,下面的就是四個臨界條件。這里注意打印的寬度為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晚年迷戀上了壘骰子,就是把骰子一個壘在另一個上邊,不能歪歪扭扭,要壘成方柱體。
經(jīng)過長期觀察,atm 發(fā)現(xiàn)了穩(wěn)定骰子的奧秘:有些數(shù)字的面貼著會互相排斥!
我們先來規(guī)范一下骰子:1 的對面是 4,2 的對面是 5,3 的對面是 6。
假設(shè)有 m 組互斥現(xiàn)象,每組中的那兩個數(shù)字的面緊貼在一起,骰子就不能穩(wěn)定的壘起來。 atm想計算一下有多少種不同的可能的壘骰子方式。
兩種壘骰子方式相同,當(dāng)且僅當(dāng)這兩種方式中對應(yīng)高度的骰子的對應(yīng)數(shù)字的朝向都相同。
由于方案數(shù)可能過多,請輸出模 10^9 + 7 的結(jié)果。
不要小看了 atm 的骰子數(shù)量哦~
「輸入格式」
第一行兩個整數(shù) n m
n表示骰子數(shù)目
接下來 m 行,每行兩個整數(shù) a b ,表示 a 和 b 不能緊貼在一起。
「輸出格式」
一行一個數(shù),表示答案模 10^9 + 7 的結(jié)果。
「樣例輸入」
2 1
1 2
「樣例輸出」
544
「數(shù)據(jù)范圍」
對于 30% 的數(shù)據(jù):n <= 5
對于 60% 的數(shù)據(jù):n <= 100
對于 100% 的數(shù)據(jù):0 < n <= 10^9, m <= 36
資源約定:
峰值內(nèi)存消耗(含虛擬機) < 256M
CPU消耗? < 2000ms
請嚴(yán)格按要求輸出,不要畫蛇添足地打印類似:“請您輸入...” 的多余內(nèi)容。
所有代碼放在同一個源文件中,調(diào)試通過后,拷貝提交該源碼。
注意:不要使用package語句。不要使用jdk1.7及以上版本的特性。
注意:主類的名字必須是:Main,否則按無效代碼處理。
解析:題目難點在于想到使用矩陣存放數(shù)據(jù),想到這種方法之后還要懂得如何求矩陣快速冪,不然肯定是會超時的。
關(guān)于矩陣快速冪可以參考下面的文章斐波那契數(shù)列(二)--矩陣優(yōu)化算法
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數(shù)組* */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;}}/*** 旋轉(zhuǎn)情況 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) { // 標(biāo)準(zhǔ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;} }總結(jié)
以上是生活随笔為你收集整理的第六届省赛(软件类)真题----Java大学C组答案及解析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JSP的三个编译指令-page,incl
- 下一篇: Java中当前的时间的各种写法