2013第四届蓝桥杯Java组省赛题解析
2013第四屆藍(lán)橋杯Java組省賽題解析
目錄
第一題:高斯日記
第二題:馬虎的算式
第三題:第39級臺階
第四題:黃金連分?jǐn)?shù)
?第五題:前綴判斷
第六題:三部排序
?第七題:錯(cuò)誤票據(jù)
第八題:翻硬幣
第九題:帶分?jǐn)?shù)
第十題:連號區(qū)間數(shù)
第一題:高斯日記
大數(shù)學(xué)家高斯有個(gè)好習(xí)慣:無論如何都要記日記。
他的日記有個(gè)與眾不同的地方,他從不注明年月日,而是用一個(gè)整數(shù)代替,比如:4210
后來人們知道,那個(gè)整數(shù)就是日期,它表示那一天是高斯出生后的第幾天。這或許也是個(gè)好習(xí)慣,它時(shí)時(shí)刻刻提醒著主人:日子又過去一天,還有多少時(shí)光可以用于浪費(fèi)呢?
高斯出生于:1777年4月30日。
在高斯發(fā)現(xiàn)的一個(gè)重要定理的日記上標(biāo)注著:5343,因此可算出那天是:1791年12月15日。
高斯獲得博士學(xué)位的那天日記上標(biāo)著:8113 ??
請你算出高斯獲得博士學(xué)位的年月日。
提交答案的格式是:yyyy-mm-dd, 例如:1980-03-21
請嚴(yán)格按照格式,通過瀏覽器提交答案。
注意:只提交這個(gè)日期,不要寫其它附加內(nèi)容,比如:說明性的文字。
package laoshifu_demo;import java.util.*; /*** * @author laoshifu* @date 2021年11月26日*/ public class Main {public static void main(String args[]) {@SuppressWarnings("resource")Scanner sc = new Scanner(System.in);int data = sc.nextInt();Calendar cc = Calendar.getInstance();// 獲得系統(tǒng)時(shí)間cc.set(1777, 3, 30);// 改變系統(tǒng)時(shí)間 設(shè)置時(shí)間 因?yàn)槠渲邢到y(tǒng)中月份是0-11 所以4月份其實(shí)為3int count = 0;while (true) {cc.add(Calendar.DATE, 1);// 讓日子每天向后加一天count++;if (count == data)break;}System.out.println(cc.get(Calendar.YEAR) + "-" + (cc.get(Calendar.MONTH) + 1) + "-" + (cc.get(Calendar.DATE) - 1));// 輸出月份時(shí)再重新加一加回去}}第二題:馬虎的算式
小明是個(gè)急性子,上小學(xué)的時(shí)候經(jīng)常把老師寫在黑板上的題目抄錯(cuò)了。
有一次,老師出的題目是:36 x 495 = ?
他卻給抄成了:396 x 45 = ?
但結(jié)果卻很戲劇性,他的答案竟然是對的!!
因?yàn)?36 * 495 = 396 * 45 = 17820
類似這樣的巧合情況可能還有很多,比如:27 * 594 = 297 * 54
假設(shè) a b c d e 代表1~9不同的5個(gè)數(shù)字(注意是各不相同的數(shù)字,且不含0)
能滿足形如: ab * cde = adb * ce 這樣的算式一共有多少種呢?
請你利用計(jì)算機(jī)的優(yōu)勢尋找所有的可能,并回答不同算式的種類數(shù)。
滿足乘法交換律的算式計(jì)為不同的種類,所以答案肯定是個(gè)偶數(shù)。
答案直接通過瀏覽器提交。
注意:只提交一個(gè)表示最終統(tǒng)計(jì)種類數(shù)的數(shù)字,不要提交解答過程或其它多余的內(nèi)容。
?
第三題:第39級臺階
小明剛剛看完電影《第39級臺階》,離開電影院的時(shí)候,他數(shù)了數(shù)禮堂前的臺階數(shù),恰好是39級!
站在臺階前,他突然又想著一個(gè)問題:
如果我每一步只能邁上1個(gè)或2個(gè)臺階。先邁左腳,然后左右交替,最后一步是邁右腳,也就是說一共要走偶數(shù)步。那么,上完39級臺階,有多少種不同的上法呢?
請你利用計(jì)算機(jī)的優(yōu)勢,幫助小明尋找答案。
要求提交的是一個(gè)整數(shù)。
注意:不要提交解答過程,或其它的輔助說明文字。
思路:使用兩個(gè)參數(shù),一個(gè)參數(shù) step 記錄走了多少步,另一個(gè)參數(shù) stairs 記錄走了多少臺階,臺階數(shù)stairs大于 39 作為退出條件,如果剛好等于 39 判斷步數(shù)是否為偶數(shù),是的話,count ++,不是偶數(shù)的話返回,其中一步的情況有兩種可能走一步臺階和兩步臺階。
package laoshifu_demo; /*** * @author laoshifu* @date 2021年11月26日*/ public class Main {/*** 上樓問題的變種,必須偶數(shù)步n 級臺階,奇數(shù)步* @param n* @return*/static int g(int n) {if (n == 1)return 1;if (n == 2)return 1;return f(n - 1) + f(n - 2);}// n 級臺階,偶數(shù)步static int f(int n) {if (n == 1)return 0;if (n == 2)return 1;return g(n - 1) + g(n - 2);}public static void main(String[] args) {System.out.println(f(39));} }?
第四題:黃金連分?jǐn)?shù)
黃金分割數(shù)0.61803... 是個(gè)無理數(shù),這個(gè)常數(shù)十分重要,在許多工程問題中會出現(xiàn)。有時(shí)需要把這個(gè)數(shù)字求得很精確。
?
對于某些精密工程,常數(shù)的精度很重要。也許你聽說過哈勃太空望遠(yuǎn)鏡,它首次升空后就發(fā)現(xiàn)了一處人工加工錯(cuò)誤,對那樣一個(gè)龐然大物,其實(shí)只是鏡面加工時(shí)有比頭發(fā)絲還細(xì)許多倍的一處錯(cuò)誤而已,卻使它成了“近視眼”!!
?
?
言歸正傳,我們?nèi)绾吻蟮命S金分割數(shù)的盡可能精確的值呢?有許多方法。
?
比較簡單的一種是用連分?jǐn)?shù):
?
?
? ? ? ? ? ? ? ? ? ? ? ? ?1
黃金數(shù) = ?--------------------------
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 1
? ? ? ? ? ? ? ? ?1 + --------------------
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 1
? ? ? ? ? ? ? ? ? ? ? ? 1 + ---------------
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 1
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?1 + ---------
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 1 + ...
?
?
?
這個(gè)連分?jǐn)?shù)計(jì)算的“層數(shù)”越多,它的值越接近黃金分割數(shù)。
?
請你利用這一特性,求出黃金分割數(shù)的足夠精確值,要求四舍五入到小數(shù)點(diǎn)后100位。
?
小數(shù)點(diǎn)后3位的值為:0.618
?
小數(shù)點(diǎn)后4位的值為:0.6180
?
小數(shù)點(diǎn)后5位的值為:0.61803
?
小數(shù)點(diǎn)后7位的值為:0.6180340
結(jié)果:
0.6180339887498948482045868343656381177203091798057628621354486227052604628189024497072072041893911375第五題:前綴判斷
問題描述
編寫一個(gè)程序,以字符串方式輸入一個(gè)前綴表達(dá)式,然后計(jì)算它的值。輸入格式為:“運(yùn)算符 對象1 對象2”,其中,運(yùn)算符為“+”(加法)、“-”(減法)、“*”(乘法)或“/”(除法),運(yùn)算對象為不超過10的整數(shù),它們之間用一個(gè)空格隔開。要求:對于加、減、乘、除這四種運(yùn)算,分別設(shè)計(jì)相應(yīng)的函數(shù)來實(shí)現(xiàn)。
輸入格式:輸入只有一行,即一個(gè)前綴表達(dá)式字符串。
輸出格式:輸出相應(yīng)的計(jì)算結(jié)果(如果是除法,直接采用c語言的“/”運(yùn)算符,結(jié)果為整數(shù))。
輸入輸出樣例
樣例輸入
+ 5 2
樣例輸出
7
補(bǔ)充知識點(diǎn):Integer.parseInt()是把()里的內(nèi)容轉(zhuǎn)換成整數(shù)。
eqIuals是判斷兩個(gè)變量或?qū)嵗赶虻膬?nèi)存空間的值是不是相同。
?
第六題:三部排序
題目描述 一般的排序有許多經(jīng)典算法,如快速排序、希爾排序等。但實(shí)際應(yīng)用時(shí),經(jīng)常會或多或少有一些特殊的要求。我們沒必要套用那些經(jīng)典算法,可以根據(jù)實(shí)際情況建立更好的解法。比如,對一個(gè)整型數(shù)組中的數(shù)字進(jìn)行分類排序:使得負(fù)數(shù)都靠左端,正數(shù)都靠右端,0在中部。注意問題的特點(diǎn)是:負(fù)數(shù)區(qū)域和正數(shù)區(qū)域內(nèi)并不要求有序。可以利用這個(gè)特點(diǎn)通過1次線性掃描就結(jié)束戰(zhàn)斗!!以下的程序?qū)崿F(xiàn)了該目標(biāo)。static void sort(int[] x){int p = 0;int left = 0;int right = x.length-1;while(p<=right){if(x[p]<0){int t = x[left];x[left] = x[p];x[p] = t;left++;p++;}else if(x[p]>0){int t = x[right];x[right] = x[p];x[p] = t;right--; }else{_________________________; //代碼填空位置}}}如果給定數(shù)組:25,18,-2,0,16,-5,33,21,0,19,-16,25,-3,0則排序后為:-3,-2,-16,-5,0,0,0,21,19,33,25,16,18,25請分析代碼邏輯,并推測劃線處的代碼,通過網(wǎng)頁提交 注意:僅把缺少的代碼作為答案,千萬不要填寫多余的代碼、符號或說明文字!! package laoshifu_demo; /*** * @author laoshifu* @date 2021年11月26日*/ public class Main {public static void main(String[] args) {int[] sort = sort(new int[]{25,18,-2,0,16,-5,33,21,0,19,-16,25,-3,0});for (int i : sort) {System.out.print(i+",");}}public static int[] sort(int[] x){int p = 0;int left = 0;int right = x.length-1;while(p<=right){if(x[p]<0){int t = x[left];x[left] = x[p];x[p] = t;left++;p++;}else if(x[p]>0){int t = x[right];x[right] = x[p];x[p] = t;right--; }else{p++;//填空位置}}return x;} }第七題:錯(cuò)誤票據(jù)
資源限制
時(shí)間限制:1.0s 內(nèi)存限制:256.0MB
問題描述
某涉密單位下發(fā)了某種票據(jù),并要在年終全部收回。
每張票據(jù)有唯一的ID號。全年所有票據(jù)的ID號是連續(xù)的,但I(xiàn)D的開始數(shù)碼是隨機(jī)選定的。
因?yàn)楣ぷ魅藛T疏忽,在錄入ID號的時(shí)候發(fā)生了一處錯(cuò)誤,造成了某個(gè)ID斷號,另外一個(gè)ID重號。
你的任務(wù)是通過編程,找出斷號的ID和重號的ID。
假設(shè)斷號不可能發(fā)生在最大和最小號。
輸入格式
要求程序首先輸入一個(gè)整數(shù)N(N<100)表示后面數(shù)據(jù)行數(shù)。
接著讀入N行數(shù)據(jù)。
每行數(shù)據(jù)長度不等,是用空格分開的若干個(gè)(不大于100個(gè))正整數(shù)(不大于100000),請注意行內(nèi)和行末可能有多余的空格,你的程序需要能處理這些空格。
每個(gè)整數(shù)代表一個(gè)ID號。
輸出格式
要求程序輸出1行,含兩個(gè)整數(shù)m n,用空格分隔。
其中,m表示斷號ID,n表示重號ID
樣例輸入1
2
5 6 8 11 9
10 12 9
樣例輸出1
7 9
樣例輸入2
6
164 178 108 109 180 155 141 159 104 182 179 118 137 184 115 124 125 129 168 196
172 189 127 107 112 192 103 131 133 169 158
128 102 110 148 139 157 140 195 197
185 152 135 106 123 173 122 136 174 191 145 116 151 143 175 120 161 134 162 190
149 138 142 146 199 126 165 156 153 193 144 166 170 121 171 132 101 194 187 188
113 130 176 154 177 120 117 150 114 183 186 181 100 163 160 167 147 198 111 119
樣例輸出2
105 120
解題思路:
1.只要能把所有的數(shù)讀進(jìn)數(shù)組里,排序后就可以遍歷產(chǎn)生答案了
2.關(guān)于nextLine如何在循環(huán)里使用,我找不到辦法;這道題我把輸入從一個(gè)個(gè)輸入改成一行行輸入,利用hasNext()方法循環(huán)判斷有沒有下一個(gè)輸入,成功把所有數(shù)讀進(jìn)數(shù)組里。?
測試數(shù)據(jù):?
6 164 178 108 109 180 155 141 159 104 182 179 118 137 184 115 124 125 129 168 196 172 189 127 107 112 192 103 131 133 169 158 128 102 110 148 139 157 140 195 197 185 152 135 106 123 173 122 136 174 191 145 116 151 143 175 120 161 134 162 190 149 138 142 146 199 126 165 156 153 193 144 166 170 121 171 132 101 194 187 188 113 130 176 154 177 120 117 150 114 183 186 181 100 163 160 167 147 198 111 119?代碼:
package laoshifu_demo;import java.util.Arrays; import java.util.Scanner;/*** * @author laoshifu* @date 2021年11月26日*/ public class Main {public static void main(String[] args) {@SuppressWarnings("resource")Scanner sc = new Scanner(System.in);int []num=new int[100001];int i_count=0,N=0,M=0;int n=sc.nextInt();//輸入nsc.nextLine();for(int i=0;i<n;i++) {Scanner scc=new Scanner(sc.nextLine());//一行行輸入while(scc.hasNext()) {//判斷有沒有下一個(gè)輸入num[i_count]=scc.nextInt();//一個(gè)一個(gè)都進(jìn)去i_count++;}}Arrays.sort(num,0,i_count);//Arrays可以指定從0到i_count-1進(jìn)行從小到大排序,不然會按照整個(gè)數(shù)組定義的大小來排for(int j=0;j<i_count;j++) {if(num[j]==num[j+1]-2) {N=num[j]+1;}if(num[j]==num[j+1]) {M=num[j];}}System.out.print(N+" "+M);} }?
第八題:翻硬幣
問題描述
小明正在玩一個(gè)“翻硬幣”的游戲。
桌上放著排成一排的若干硬幣。我們用 * 表示正面,用 o 表示反面(是小寫字母,不是零)。
比如,可能情形是:**oo***oooo
如果同時(shí)翻轉(zhuǎn)左邊的兩個(gè)硬幣,則變?yōu)?#xff1a;oooo***oooo
現(xiàn)在小明的問題是:如果已知了初始狀態(tài)和要達(dá)到的目標(biāo)狀態(tài),每次只能同時(shí)翻轉(zhuǎn)相鄰的兩個(gè)硬幣,那么對特定的局面,最少要翻動(dòng)多少次呢?
我們約定:把翻動(dòng)相鄰的兩個(gè)硬幣叫做一步操作,那么要求:
輸入格式
兩行等長的字符串,分別表示初始狀態(tài)和要達(dá)到的目標(biāo)狀態(tài)。每行的長度<1000
輸出格式
一個(gè)整數(shù),表示最小操作步數(shù)。
樣例輸入1
**********
o****o****
樣例輸出1
5
樣例輸入2
*o**o***o***
*o***o**o***
樣例輸出2
1
?
第九題:帶分?jǐn)?shù)
100 可以表示為帶分?jǐn)?shù)的形式100 = 3 + 69258 / 714
還可以表示為100 = 82 + 3546 / 197
注意特征帶分?jǐn)?shù)中數(shù)字1~9分別出現(xiàn)且只出現(xiàn)一次不包含0。
類似這樣的帶分?jǐn)?shù)100 有 11 種表示法。
題目要求從標(biāo)準(zhǔn)輸入讀入一個(gè)正整數(shù)N (N<1000*1000)程序輸出該數(shù)字用數(shù)碼
1~9不重復(fù)不遺漏地組成帶分?jǐn)?shù)表示的全部種數(shù)。注意不要求輸出每個(gè)表示
只統(tǒng)計(jì)有多少表示法
例如用戶輸入100
程序輸出11
再例如用戶輸入105
程序輸出6
代碼分析:對1-9進(jìn)行全排列,枚舉加號除號的位置,符合條件的式子加一;
第十題:連號區(qū)間數(shù)
資源限制
時(shí)間限制:1.0s 內(nèi)存限制:256.0MB
問題描述
小明這些天一直在思考這樣一個(gè)奇怪而有趣的問題:
在1~N的某個(gè)全排列中有多少個(gè)連號區(qū)間呢?這里所說的連號區(qū)間的定義是:
如果區(qū)間[L, R] 里的所有元素(即此排列的第L個(gè)到第R個(gè)元素)遞增排序后能得到一個(gè)長度為R-L+1的“連續(xù)”數(shù)列,則稱這個(gè)區(qū)間連號區(qū)間。
當(dāng)N很小的時(shí)候,小明可以很快地算出答案,但是當(dāng)N變大的時(shí)候,問題就不是那么簡單了,現(xiàn)在小明需要你的幫助。
輸入格式
第一行是一個(gè)正整數(shù)N (1 <= N <= 50000), 表示全排列的規(guī)模。
第二行是N個(gè)不同的數(shù)字Pi(1 <= Pi <= N), 表示這N個(gè)數(shù)字的某一全排列。
輸出格式
輸出一個(gè)整數(shù),表示不同連號區(qū)間的數(shù)目。
樣例輸入1
4
3 2 4 1
樣例輸出1
7
樣例輸入2
5
3 4 2 5 1
樣例輸出2
9
二、解題思路
題目關(guān)鍵字給的是并查集,想不出來怎么用并查集做,我人傻了。理解題意,實(shí)際就是要判斷這個(gè)區(qū)間的長度等于(最大值-最小值),注意單個(gè)數(shù)字也能成一個(gè)區(qū)間。
?
?
總結(jié)
以上是生活随笔為你收集整理的2013第四届蓝桥杯Java组省赛题解析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【2022年蓝桥杯】蓝桥杯第一次海选考试
- 下一篇: laravel框架安装(奶妈式手把手一步