2014第五屆藍橋杯省賽java B組題解

各題分值:

1.武功祕籍(結果填空) 2分
2.切面條(結果填空) 5分
3.猜字母 ( 結果填空) 6分
4.大衍數列( 代碼填空) 4分
5.圓周率( 代碼填空) 9分
6.奇怪的分式( 結果填空) 11分
7.撲克序列( 編程大題) 15分
8.分糖果(編程大題) 7分
9.地宮取寶(編程大題) 18分
10.矩陣翻硬幣(編程大題) 23分

第一題

題目:武功祕籍

小明到X山洞探險,撿到一本有破損的武功祕籍(2000多頁!當然是僞造的)。他注意到:
書的第10頁和第11頁在同一張紙上,但第11頁和第12頁不在同一張紙上。
小明只想練習該書的第81頁到第92頁的武功,又不想帶着整本書。
請問他至少要撕下多少張紙帶走?
這是個整數,請通過瀏覽器提交該數字,不要填寫任何多餘的內容。

思路:單頁在背,雙數在正頁,手算即可

答案:7

第二題

題目:切面條

一根高筋拉麪,中間切一刀,可以得到2根麪條。
如果先對摺1次,中間切一刀,可以得到3根麪條。
如果連續對摺2次,中間切一刀,可以得到5根麪條。
那麼,連續對摺10次,中間切一刀,會得到多少麪條呢?

思路:找規律:2^n+1, 或者拿一張紙對摺也能推推出來

答案:1025

第三題

題目:猜字母

把abcd...s共19個字母組成的序列重複拼接106次,得到長度爲2014的串。

接下來刪除第1個字母(即開頭的字母a),以及第3個,第5個等所有奇數位置的字母。

得到的新串再進行刪除奇數位置字母的動作。如此下去,最後只剩下一個字母,請寫出該字母。

答案是一個小寫字母,請通過瀏覽器提交答案。不要填寫任何多餘的內容
public class Main {
	
	public static void main(String[] args) {
		String s = "abcdefghijklmnopqrs";
		String ss = "";
		for(int i =1 ;i<107;i++){              //拼接字符串
			ss +=s;
		}
		
		while (ss.length() !=1) {
			String out = "";
			for(int i=0;i<ss.length();i++){
				if(i%2!=0){                    //因爲index是從0開始,所以這裏的偶數就是題目中的奇數
					out +=ss.charAt(i);
				}
			}
			ss=out;                            //重新將切割後的字符賦值
		}
		System.out.println(ss);
	}
}
答案:q

第四題

題目:大衍數列

問題描述:

中國古代文獻中,曾記載過“大衍數列”, 主要用於解釋中國傳統文化中的太極衍生原理。

它的前幾項是:0248121824324050 ...

其規律是:對偶數項,是序號平方再除2,奇數項,是序號平方減1再除2。

以下的代碼打印出了大衍數列的前 100 項。

for(int i=1; i<100; i++)
{
if(________________) //填空
System.out.println(i*i/2);
else
System.out.println((i*i-1)/2);
}

請填寫劃線部分缺失的代碼。通過瀏覽器提交答案。
答案:i%2==0

第五題

圓周率

數學發展歷史上,圓周率的計算曾有許多有趣甚至是傳奇的故事。其中許多方
法都涉及無窮級數。

圖1.png中所示,就是一種用連分數的形式表示的圓周率求法。

下面的程序實現了該求解方法。實際上數列的收斂對x的初始值 並不敏感。 

結果打印出圓周率近似值(保留小數點後4位,並不一定與圓周率真值吻合)。

在這裏插入圖片描述
double x = 111;
for(int n = 10000; n>=0; n–){
int i = 2 * n + 1;
x = 2 + (i*i / x);
}
System.out.println(String.format("%.4f", ______________));

思路:按公式推,當n=1時,x多加了1

答案: 4/(x-1)

第六題

題目:奇怪的分式

上小學的時候,小明經常自己發明新算法。一次,老師出的題目是

1/4 乘以 8/5 

小明居然把分子拼接在一起,分母拼接在一起,答案是:18/45 (參見下圖)

在這裏插入圖片描述
老師剛想批評他,轉念一想,這個答案湊巧也對啊,真是見鬼!

對於分子、分母都是 1~9 中的一位數的情況,還有哪些算式可以這樣計算呢?

請寫出所有不同算式的個數(包括題中舉例的)。

顯然,交換分子分母后,例如:4/1 乘以 5/8 是滿足要求的,這算做不同的算式。

但對於分子分母相同的情況,2/2 乘以 3/3 這樣的類型太多了,不在計數之列!

注意:答案是個整數(考慮對稱性,肯定是偶數)。請通過瀏覽器提交。

public class Main {
	
	public static void main(String[] args) {
		int ans=0;
		float num1=0;
        float num2=0;
         for(float a=1;a<=9;a++) {
        	 for(float b=1;b<=9;b++) {
        		 for(float c=1;c<=9;c++) {
        			 for(float d=1;d<=9;d++) {
        				 if(a==b || c==d)  continue;
        				 num1=(a*c)/(b*d);
        				 num2=(a*10+c)/(b*10+d);
        				 if(num1==num2) {
        					 ans++;
        				 }
        			 }
        		 }
        	 }
         }
         System.out.println(ans);
	}
}

思路:用int精度不夠、a/b * c/d都會導致算錯,要用float、先分子相乘再除以分母ac / bd

答案:14

第七題

題目:撲克排序

撲克牌 
A A 2 2 3 3 4 4, 一共4對撲克牌。請你把它們排成一行。 
要求:兩個A中間有1張牌,兩個2之間有2張牌,兩個3之間有3張牌,兩個4之間有4張牌。

請填寫出所有符合要求的排列中,字典序最小的那個。 
import java.util.HashSet;
public class Main {

	public static void main(String[] args) {
		int[] arr = { 1, 1, 2, 2, 3, 3, 4, 4 };
		fullSort(arr, 0, arr.length - 1);

	}
	//	遞歸,進行全排列
	public static void fullSort(int[] arr, int start, int end) {
		if (start == end) {
			String ss = "";
			for (int i = 0; i < arr.length; i++) {
				ss += String.valueOf(arr[i]);
			}
			if (check(ss)) {
				System.out.println(ss);
			}
			return;
		} else {
			for (int i = start; i <= end; i++) {
				swap(arr, i, start);
				fullSort(arr, start + 1, end);
				swap(arr, i, start);
			}
		}

	}

	private static void swap(int[] arr, int i, int j) {
		int temp = arr[i];
		arr[i] = arr[j];
		arr[j] = temp;
	}

	private static boolean check(String s) {
		if (s.lastIndexOf('1') - s.indexOf('1') == 2 && // 兩個A中間有1張牌,下標差2.
				s.lastIndexOf('2') - s.indexOf('2') == 3 && // 兩個2之間有2張牌,下標差3.
				s.lastIndexOf('3') - s.indexOf('3') == 4 && // 兩個3之間有3張牌,下標差4.
				s.lastIndexOf('4') - s.indexOf('4') == 5) // 兩個4之間有4張牌,下標差5.
			return true;
		return false;
	}
}

結果有兩個,但是最小的是第一個,(把1換成A)
23421314
41312432

答案:2342A3A4

第八題

題目:分糖果

有n個小朋友圍坐成一圈。老師給每個小朋友隨機發偶數個糖果,然後進行下面的遊戲: 

每個小朋友都把自己的糖果分一半給左手邊的孩子。 

一輪分糖後,擁有奇數顆糖的孩子由老師補給1個糖果,從而變成偶數。 

反覆進行這個遊戲,直到所有小朋友的糖果數都相同爲止。 

你的任務是預測在已知的初始糖果情形下,老師一共需要補發多少個糖果。 

輸入

程序首先讀入一個整數N(2< N< 100),表示小朋友的人數。 

接着是一行用空格分開的N個偶數(每個偶數不大於1000,不小於2) 

輸出

要求程序輸出一個整數,表示老師需要補發的糖果數。

樣例輸入

3

2 2 4

樣例輸出

4

第九題

題目:地宮取寶

X 國王有一個地宮寶庫。是 n x m 個格子的矩陣。每個格子放一件寶貝。每個寶貝貼着價值標籤。
地宮的入口在左上角,出口在右下角。
小明被帶到地宮的入口,國王要求他只能向右或向下行走。
走過某個格子時,如果那個格子中的寶貝價值比小明手中任意寶貝價值都大,小明就可以拿起它(當然,也可以不拿)。
當小明走到出口時,如果他手中的寶貝恰好是k件,則這些寶貝就可以送給小明。
請你幫小明算一算,在給定的局面下,他有多少種不同的行動方案能獲得這k件寶貝。
【數據格式】
輸入一行3個整數,用空格分開:n m k (1<=n,m<=50, 1<=k<=12)
接下來有 n 行數據,每行有 m 個整數 Ci (0<=Ci<=12)代表這個格子上的寶物的價值
要求輸出一個整數,表示正好取k個寶貝的行動方案數。該數字可能很大,輸出它對 1000000007 取模的結果。
例如,輸入:
2 2 2
1 2
2 1
程序應該輸出:
2
再例如,輸入:
2 3 2
1 2 3
2 1 5
程序應該輸出:
14

第十題

題目:矩陣翻硬幣
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章