藍橋杯那些事

標題: 振興中華

小明參加了學校的趣味運動會,其中的一個項目是:跳格子。

   地上畫着一些格子,每個格子裏寫一個字,如下所示:


從我做起振
我做起振興
做起振興中
起振興中華

    比賽時,先站在左上角的寫着“從”字的格子裏,可以橫向或縱向跳到相鄰的格子裏,但不能跳到對角的格子或其它位置。一直要跳到“華”字結束。
    要求跳過的路線剛好構成“從我做起振興中華”這句話。
    請你幫助小明算一算他一共有多少種可能的跳躍路線呢?
    答案是一個整數,請通過瀏覽器直接提交該數字。

    注意:不要提交解答過程,或其它輔助說明類的內容。


以下爲代碼:

public class Main {
	static int moveX = 1;
	static int moveY = 1;
	static int nowX = 0;
	static int nowY = 0;
	static int maxX = 4;
	static int maxY = 5;
	static int wayNum = 0;
	static int nowNum = 1;
	static int array[][] = new int[][] {{1,2,3,4,5,},
										{2,3,4,5,6,},
										{3,4,5,6,7,},
										{4,5,6,7,8,}};
	
	public static void main(String[] args) {
		find8();
		System.out.println(wayNum);
	}
	
	static void find8(){
		nowX += moveX;
		if(nowX < maxX)
		{
			if(array[nowX][nowY] == 8)
				wayNum++;
			find8();
		}
		nowX -= moveX;
		nowY += moveY;
		if(nowY < maxY)
		{
			if(array[nowX][nowY] == 8)
				wayNum++;
			find8();
		}
		nowY -= moveY;
	}
}

標題: 梅森素數

 如果一個數字的所有真因子之和等於自身,則稱它爲“完全數”或“完美數”
    例如:6 = 1 + 2 + 3
    28 = 1 + 2 + 4 + 7 + 14
    早在公元前300多年,歐幾里得就給出了判定完全數的定理:
    若 2^n - 1 是素數,則 2^(n-1) * (2^n - 1) 是完全數。
    其中 ^ 表示“乘方”運算,乘方的優先級比四則運算高,例如:2^3 = 8, 2 * 2^3 = 16, 2^3-1 = 7
    但人們很快發現,當n很大時,判定一個大數是否爲素數到今天也依然是個難題。
    因爲法國數學家梅森的猜想,我們習慣上把形如:2^n - 1 的素數稱爲:梅森素數。
    截止2013年2月,一共只找到了48個梅森素數。 新近找到的梅森素數太大,以至於難於用一般的編程思路窺其全貌,所以我們把任務的難度降低一點:
    1963年,美國伊利諾伊大學爲了紀念他們找到的第23個梅森素數 n=11213,在每個寄出的信封上都印上了“2^11213-1 是素數”的字樣。
    2^11213 - 1 這個數字已經很大(有3000多位),請你編程求出這個素數的十進制表示的最後100位。

答案是一個長度爲100的數字串,請通過瀏覽器直接提交該數字。

注意:不要提交解答過程,或其它輔助說明類的內容。


以下爲代碼示例:

public class Main {
	
	public static void main(String[] args) {
		int back100[] = new int[100];
		int time = 11213;
		int jinwei = 0;
		back100[0] = 1;
		for (int i = 0; i < time; i++)
		{
			for(int j = 0; j < 100; j++)
			{
				if(back100[j]!=0)
					back100[j]*=2;
				back100[j]+=jinwei;
				if(back100[j] >= 10)
				{
					back100[j] -= 10;
					jinwei = 1;
				}else
					jinwei = 0;
			}
			jinwei = 0;
		}
		back100[0]--;
		for (int i = 99; i >= 0; i--)
			System.out.print(back100[i]);
	}
}

標題: 顛倒的價牌

小李的店裏專賣其它店中下架的樣品電視機,可稱爲:樣品電視專賣店。
    其標價都是4位數字(即千元不等)。
    小李爲了標價清晰、方便,使用了預製的類似數碼管的標價籤,只要用顏色筆塗數字就可以了(參見p1.jpg)。
    這種價牌有個特點,對一些數字,倒過來看也是合理的數字。如:1 2 5 6 8 9 0 都可以。這樣一來,如果牌子掛倒了,有可能完全變成了另一個價格,比如:1958 倒着掛就是:8561,差了幾千元啊!! 
    當然,多數情況不能倒讀,比如,1110 就不能倒過來,因爲0不能作爲開始數字。
    有一天,悲劇終於發生了。某個店員不小心把店裏的某兩個價格牌給掛倒了。並且這兩個價格牌的電視機都賣出去了!
    慶幸的是價格出入不大,其中一個價牌賠了2百多,另一個價牌卻賺了8百多,綜合起來,反而多賺了558元。
    請根據這些信息計算:賠錢的那個價牌正確的價格應該是多少?
答案是一個4位的整數,請通過瀏覽器直接提交該數字。

注意:不要提交解答過程,或其它輔助說明類的內容。


以下是代碼:

public class Main {
	
	public static void main(String[] args) {
		int num[]={0,1,2,-1,-1,5,9,-1,8,6};//記錄轉換的值
		int firstPrice, secondPrice; 
		int dao_firstPrice, dao_secondPrice;
		int ge, shi, bai, qian;
		int temp = 0;//記錄差值
		for(int i = 200; i < 10000; i++)
		{
			if(i%10==0)
				continue;
			firstPrice = i;
			qian = firstPrice / 1000;
			bai = (firstPrice - qian *1000) / 100;
			shi = (firstPrice - qian *1000 - bai * 100) / 10;
			ge = firstPrice % 10;
			if(num[qian] < 0 || num[bai] < 0 ||
					num[shi] < 0 || num[ge] < 0)
				continue;
			dao_firstPrice = num[qian] + 10 * num[bai]
								+ 100 * num[shi] + 1000 * num[ge];
			if(firstPrice - dao_firstPrice > 200 && firstPrice - dao_firstPrice < 300)
			{
				temp = 558 - dao_firstPrice + firstPrice;
				for(int x = 800; x < 10000; x++)
				{
					if(x%10==0)
						continue;
					secondPrice = x;
					qian = secondPrice / 1000;
					bai = (secondPrice - qian *1000) / 100;
					shi = (secondPrice - qian *1000 - bai * 100) / 10;
					ge = secondPrice % 10;
					if(num[qian] < 0 || num[bai] < 0 ||
							num[shi] < 0 || num[ge] < 0)
						continue;
					dao_secondPrice = num[qian] + 10 * num[bai]
										+ 100 * num[shi] + 1000 * num[ge];
					if(dao_secondPrice - secondPrice > 800 && dao_secondPrice - secondPrice < 900)
					{
						if(temp == dao_secondPrice - secondPrice)
						{
							System.out.println(firstPrice);
							break;
						}
					}
				}
			}
		}
	}
}
結果爲9088;

標題:三部排序

 一般的排序有許多經典算法,如快速排序、希爾排序等。
    但實際應用時,經常會或多或少有一些特殊的要求。我們沒必要套用那些經典算法,可以根據實際情況建立更好的解法。
    比如,對一個整型數組中的數字進行分類排序:
    使得負數都靠左端,正數都靠右端,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
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

請分析代碼邏輯,並推測劃線處的代碼,通過網頁提交

注意:僅把缺少的代碼作爲答案,千萬不要填寫多餘的代碼、符號或說明文字!!


答案是:

p++;


標題:逆波蘭表達式

正常的表達式稱爲中綴表達式,運算符在中間,主要是給人閱讀的,機器求解並不方便。
    例如:3 + 5 * (2 + 6) - 1
    而且,常常需要用括號來改變運算次序。
    相反,如果使用逆波蘭表達式(前綴表達式)表示,上面的算式則表示爲:
    - + 3 * 5 + 2 6 1
    不再需要括號,機器可以用遞歸的方法很方便地求解。
    爲了簡便,我們假設:
    1. 只有 + - * 三種運算符
    2. 每個運算數都是一個小於10的非負整數
    下面的程序對一個逆波蘭表示串進行求值。
    其返回值爲一個數組:其中第一元素表示求值結果,第二個元素表示它已解析的字符數。

static int[] evaluate(String x)
{
	if(x.length()==0) return new int[] {0,0};

	char c = x.charAt(0);
	if(c>='0' && c<='9') return new int[] {c-'0',1};

	int[] v1 = evaluate(x.substring(1));
	int[] v2 = __________________________________________;  //填空位置

	int v = Integer.MAX_VALUE;
	if(c=='+') v = v1[0] + v2[0];
	if(c=='*') v = v1[0] * v2[0];
	if(c=='-') v = v1[0] - v2[0];

	return new int[] {v,1+v1[1]+v2[1]};
}


請分析代碼邏輯,並推測劃線處的代碼,通過網頁提交。

注意:僅把缺少的代碼作爲答案,千萬不要填寫多餘的代碼、符號或說明文字!!

答案是:

x.substring(v1[1]+1);



世紀末的星期

    曾有邪教稱1999年12月31日是世界末日。當然該謠言已經不攻自破

    還有人稱今後的某個世紀末的12月31日,如果是星期一則會....

    有趣的是,任何一個世紀末的年份的12月31日都不可能是星期一!! 
    於是,“謠言製造商”又修改爲星期日......
    1999年的12月31日是星期五,請問:未來哪一個離我們最近的一個世紀末年(即xx99年)的12月31日正好是星期天(即星期日)

    請回答該年份(只寫這個4位整數,不要寫12月31等多餘信息)

代碼如下:

public class Main {
	
	public static void main(String[] args) {
		int nowYear = 1999;
		int gap = 100;
		int runYearNum = 0;
		int nowWeek = 5;
		int allDay = 0;
		while(true)
		{
			for(int i = 0; i < gap; i++)
			{
				nowYear++;
				if(nowYear % 4 == 0 && nowYear % 100 != 0)
				{
					runYearNum++;
				}else if(nowYear % 400 ==0){
					runYearNum++;
				}
			}
			allDay = runYearNum * 366 + (gap - runYearNum) * 365;
			if((allDay - nowWeek) % 7 == 0)
				break;
		}
		System.out.println(nowYear);
	}
	

}


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