2013第四届蓝桥杯Java组省赛题解析
2013第四屆藍橋杯Java組省賽題解析
目錄
第一題:高斯日記
第二題:馬虎的算式
第三題:第39級臺階
第四題:黃金連分數
?第五題:前綴判斷
第六題:三部排序
?第七題:錯誤票據
第八題:翻硬幣
第九題:帶分數
第十題:連號區間數
第一題:高斯日記
大數學家高斯有個好習慣:無論如何都要記日記。
他的日記有個與眾不同的地方,他從不注明年月日,而是用一個整數代替,比如:4210
后來人們知道,那個整數就是日期,它表示那一天是高斯出生后的第幾天。這或許也是個好習慣,它時時刻刻提醒著主人:日子又過去一天,還有多少時光可以用于浪費呢?
高斯出生于:1777年4月30日。
在高斯發現的一個重要定理的日記上標注著:5343,因此可算出那天是:1791年12月15日。
高斯獲得博士學位的那天日記上標著:8113 ??
請你算出高斯獲得博士學位的年月日。
提交答案的格式是:yyyy-mm-dd, 例如:1980-03-21
請嚴格按照格式,通過瀏覽器提交答案。
注意:只提交這個日期,不要寫其它附加內容,比如:說明性的文字。
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();// 獲得系統時間cc.set(1777, 3, 30);// 改變系統時間 設置時間 因為其中系統中月份是0-11 所以4月份其實為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));// 輸出月份時再重新加一加回去}}第二題:馬虎的算式
小明是個急性子,上小學的時候經常把老師寫在黑板上的題目抄錯了。
有一次,老師出的題目是:36 x 495 = ?
他卻給抄成了:396 x 45 = ?
但結果卻很戲劇性,他的答案竟然是對的!!
因為 36 * 495 = 396 * 45 = 17820
類似這樣的巧合情況可能還有很多,比如:27 * 594 = 297 * 54
假設 a b c d e 代表1~9不同的5個數字(注意是各不相同的數字,且不含0)
能滿足形如: ab * cde = adb * ce 這樣的算式一共有多少種呢?
請你利用計算機的優勢尋找所有的可能,并回答不同算式的種類數。
滿足乘法交換律的算式計為不同的種類,所以答案肯定是個偶數。
答案直接通過瀏覽器提交。
注意:只提交一個表示最終統計種類數的數字,不要提交解答過程或其它多余的內容。
?
第三題:第39級臺階
小明剛剛看完電影《第39級臺階》,離開電影院的時候,他數了數禮堂前的臺階數,恰好是39級!
站在臺階前,他突然又想著一個問題:
如果我每一步只能邁上1個或2個臺階。先邁左腳,然后左右交替,最后一步是邁右腳,也就是說一共要走偶數步。那么,上完39級臺階,有多少種不同的上法呢?
請你利用計算機的優勢,幫助小明尋找答案。
要求提交的是一個整數。
注意:不要提交解答過程,或其它的輔助說明文字。
思路:使用兩個參數,一個參數 step 記錄走了多少步,另一個參數 stairs 記錄走了多少臺階,臺階數stairs大于 39 作為退出條件,如果剛好等于 39 判斷步數是否為偶數,是的話,count ++,不是偶數的話返回,其中一步的情況有兩種可能走一步臺階和兩步臺階。
package laoshifu_demo; /*** * @author laoshifu* @date 2021年11月26日*/ public class Main {/*** 上樓問題的變種,必須偶數步n 級臺階,奇數步* @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 級臺階,偶數步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));} }?
第四題:黃金連分數
黃金分割數0.61803... 是個無理數,這個常數十分重要,在許多工程問題中會出現。有時需要把這個數字求得很精確。
?
對于某些精密工程,常數的精度很重要。也許你聽說過哈勃太空望遠鏡,它首次升空后就發現了一處人工加工錯誤,對那樣一個龐然大物,其實只是鏡面加工時有比頭發絲還細許多倍的一處錯誤而已,卻使它成了“近視眼”!!
?
?
言歸正傳,我們如何求得黃金分割數的盡可能精確的值呢?有許多方法。
?
比較簡單的一種是用連分數:
?
?
? ? ? ? ? ? ? ? ? ? ? ? ?1
黃金數 = ?--------------------------
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 1
? ? ? ? ? ? ? ? ?1 + --------------------
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 1
? ? ? ? ? ? ? ? ? ? ? ? 1 + ---------------
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 1
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?1 + ---------
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 1 + ...
?
?
?
這個連分數計算的“層數”越多,它的值越接近黃金分割數。
?
請你利用這一特性,求出黃金分割數的足夠精確值,要求四舍五入到小數點后100位。
?
小數點后3位的值為:0.618
?
小數點后4位的值為:0.6180
?
小數點后5位的值為:0.61803
?
小數點后7位的值為:0.6180340
結果:
0.6180339887498948482045868343656381177203091798057628621354486227052604628189024497072072041893911375第五題:前綴判斷
問題描述
編寫一個程序,以字符串方式輸入一個前綴表達式,然后計算它的值。輸入格式為:“運算符 對象1 對象2”,其中,運算符為“+”(加法)、“-”(減法)、“*”(乘法)或“/”(除法),運算對象為不超過10的整數,它們之間用一個空格隔開。要求:對于加、減、乘、除這四種運算,分別設計相應的函數來實現。
輸入格式:輸入只有一行,即一個前綴表達式字符串。
輸出格式:輸出相應的計算結果(如果是除法,直接采用c語言的“/”運算符,結果為整數)。
輸入輸出樣例
樣例輸入
+ 5 2
樣例輸出
7
補充知識點:Integer.parseInt()是把()里的內容轉換成整數。
eqIuals是判斷兩個變量或實例所指向的內存空間的值是不是相同。
?
第六題:三部排序
題目描述 一般的排序有許多經典算法,如快速排序、希爾排序等。但實際應用時,經常會或多或少有一些特殊的要求。我們沒必要套用那些經典算法,可以根據實際情況建立更好的解法。比如,對一個整型數組中的數字進行分類排序:使得負數都靠左端,正數都靠右端,0在中部。注意問題的特點是:負數區域和正數區域內并不要求有序。可以利用這個特點通過1次線性掃描就結束戰斗!!以下的程序實現了該目標。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{_________________________; //代碼填空位置}}}如果給定數組: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請分析代碼邏輯,并推測劃線處的代碼,通過網頁提交 注意:僅把缺少的代碼作為答案,千萬不要填寫多余的代碼、符號或說明文字!! 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;} }第七題:錯誤票據
資源限制
時間限制:1.0s 內存限制:256.0MB
問題描述
某涉密單位下發了某種票據,并要在年終全部收回。
每張票據有唯一的ID號。全年所有票據的ID號是連續的,但ID的開始數碼是隨機選定的。
因為工作人員疏忽,在錄入ID號的時候發生了一處錯誤,造成了某個ID斷號,另外一個ID重號。
你的任務是通過編程,找出斷號的ID和重號的ID。
假設斷號不可能發生在最大和最小號。
輸入格式
要求程序首先輸入一個整數N(N<100)表示后面數據行數。
接著讀入N行數據。
每行數據長度不等,是用空格分開的若干個(不大于100個)正整數(不大于100000),請注意行內和行末可能有多余的空格,你的程序需要能處理這些空格。
每個整數代表一個ID號。
輸出格式
要求程序輸出1行,含兩個整數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.只要能把所有的數讀進數組里,排序后就可以遍歷產生答案了
2.關于nextLine如何在循環里使用,我找不到辦法;這道題我把輸入從一個個輸入改成一行行輸入,利用hasNext()方法循環判斷有沒有下一個輸入,成功把所有數讀進數組里。?
測試數據:?
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()) {//判斷有沒有下一個輸入num[i_count]=scc.nextInt();//一個一個都進去i_count++;}}Arrays.sort(num,0,i_count);//Arrays可以指定從0到i_count-1進行從小到大排序,不然會按照整個數組定義的大小來排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);} }?
第八題:翻硬幣
問題描述
小明正在玩一個“翻硬幣”的游戲。
桌上放著排成一排的若干硬幣。我們用 * 表示正面,用 o 表示反面(是小寫字母,不是零)。
比如,可能情形是:**oo***oooo
如果同時翻轉左邊的兩個硬幣,則變為:oooo***oooo
現在小明的問題是:如果已知了初始狀態和要達到的目標狀態,每次只能同時翻轉相鄰的兩個硬幣,那么對特定的局面,最少要翻動多少次呢?
我們約定:把翻動相鄰的兩個硬幣叫做一步操作,那么要求:
輸入格式
兩行等長的字符串,分別表示初始狀態和要達到的目標狀態。每行的長度<1000
輸出格式
一個整數,表示最小操作步數。
樣例輸入1
**********
o****o****
樣例輸出1
5
樣例輸入2
*o**o***o***
*o***o**o***
樣例輸出2
1
?
第九題:帶分數
100 可以表示為帶分數的形式100 = 3 + 69258 / 714
還可以表示為100 = 82 + 3546 / 197
注意特征帶分數中數字1~9分別出現且只出現一次不包含0。
類似這樣的帶分數100 有 11 種表示法。
題目要求從標準輸入讀入一個正整數N (N<1000*1000)程序輸出該數字用數碼
1~9不重復不遺漏地組成帶分數表示的全部種數。注意不要求輸出每個表示
只統計有多少表示法
例如用戶輸入100
程序輸出11
再例如用戶輸入105
程序輸出6
代碼分析:對1-9進行全排列,枚舉加號除號的位置,符合條件的式子加一;
第十題:連號區間數
資源限制
時間限制:1.0s 內存限制:256.0MB
問題描述
小明這些天一直在思考這樣一個奇怪而有趣的問題:
在1~N的某個全排列中有多少個連號區間呢?這里所說的連號區間的定義是:
如果區間[L, R] 里的所有元素(即此排列的第L個到第R個元素)遞增排序后能得到一個長度為R-L+1的“連續”數列,則稱這個區間連號區間。
當N很小的時候,小明可以很快地算出答案,但是當N變大的時候,問題就不是那么簡單了,現在小明需要你的幫助。
輸入格式
第一行是一個正整數N (1 <= N <= 50000), 表示全排列的規模。
第二行是N個不同的數字Pi(1 <= Pi <= N), 表示這N個數字的某一全排列。
輸出格式
輸出一個整數,表示不同連號區間的數目。
樣例輸入1
4
3 2 4 1
樣例輸出1
7
樣例輸入2
5
3 4 2 5 1
樣例輸出2
9
二、解題思路
題目關鍵字給的是并查集,想不出來怎么用并查集做,我人傻了。理解題意,實際就是要判斷這個區間的長度等于(最大值-最小值),注意單個數字也能成一個區間。
?
?
總結
以上是生活随笔為你收集整理的2013第四届蓝桥杯Java组省赛题解析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【2022年蓝桥杯】蓝桥杯第一次海选考试
- 下一篇: laravel框架安装(奶妈式手把手一步