1. 程式人生 > >第五屆藍橋杯Java語言C組_單位分數

第五屆藍橋杯Java語言C組_單位分數

形如:1/a 的分數稱為單位分數。

可以把1分解為若干個互不相同的單位分數之和。
例如:
1 = 1/2 + 1/3 + 1/9 + 1/18
1 = 1/2 + 1/3 + 1/10 + 1/15
1 = 1/3 + 1/5 + 1/7 + 1/9 + 1/11 + 1/15 + 1/35 + 1/45 + 1/231
等等,類似這樣的分解無窮無盡。

我們增加一個約束條件:最大的分母必須不超過30

請你求出分解為n項時的所有不同分解法。

資料格式要求:

輸入一個整數n,表示要分解為n項(n<12)
輸出分解後的單位分數項,中間用一個空格分開。
每種分解法佔用一行,行間的順序按照分母從小到大排序。

例如,
輸入:
4
程式應該輸出:
1/2 1/3 1/8 1/24
1/2 1/3 1/9 1/18
1/2 1/3 1/10 1/15
1/2 1/4 1/5 1/20
1/2 1/4 1/6 1/12

再例如,
輸入:
5
程式應該輸出:
1/2 1/3 1/12 1/21 1/28
1/2 1/4 1/6 1/21 1/28
1/2 1/4 1/7 1/14 1/28
1/2 1/4 1/8 1/12 1/24
1/2 1/4 1/9 1/12 1/18
1/2 1/4 1/10 1/12 1/15
1/2 1/5 1/6 1/12 1/20
1/3 1/4 1/5 1/6 1/20


資源約定:
峰值記憶體消耗(含虛擬機器) < 256M
CPU消耗  < 2000ms


請嚴格按要求輸出,不要畫蛇添足地列印類似:“請您輸入...” 的多餘內容。

所有程式碼放在同一個原始檔中,除錯通過後,拷貝提交該原始碼。
注意:不要使用package語句。不要使用jdk1.7及以上版本的特性。
注意:主類的名字必須是:Main,否則按無效程式碼處理。

解析:這道題目有問題,分母應該是小於30。這道題目要用遞迴去寫,由於分數運算會導致精度丟失,所以

必須用求出最小公倍數的方法來解決這道題目。

import java.util.Scanner;

public class Main {

	static long tmp = 2329089562800l;//求出1-30的最小公倍數

	/**
		 * 
		 * @param arr 儲存分母的陣列
		 * @param k  當前下標位置
		 * @param t 前面一個分母
		 */
	public static void f2(int arr[], int k, int t, long res) {

		if (k == arr.length) {
			long sum = 0;

			if (res == tmp) {
				for (int i = 0; i < arr.length; i++) {
					//					if (i == arr.length - 1) {
					//						System.out.println("1/" + arr[i]);
					//					} else {
					//						System.out.print("1/" + arr[i] + " ");
					//					}
					System.out.print(arr[i] + " ");
				}
				System.out.println();

			}

			return;
		}

		if (k == arr.length - 3) {//在這個位置檢查前面的項數和是否超過了1

			if (res > tmp) {
				return;
			}
		}
		for (int i = t + 1; i < 30; i++) {//題目應該是分母不能超過30
			arr[k] = i;

			f2(arr, k + 1, i, res + tmp / i);
		}
	}

	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		while (input.hasNext()) {
			int n = input.nextInt();
			//計算開始時間
			long start = System.currentTimeMillis();
			int arr[] = new int[n];

			f2(arr, 0, 0, 0);

			//計算結束時間
			long end = System.currentTimeMillis();
			//得到程式執行所耗時間
			System.out.println("time=" + (end - start));
		}
	}
}


相關推薦

藍橋Java語言C_單位分數

形如:1/a 的分數稱為單位分數。 可以把1分解為若干個互不相同的單位分數之和。 例如: 1 = 1/2 + 1/3 + 1/9 + 1/18 1 = 1/2 + 1/3 + 1/10 + 1/15

藍橋Java語言C_調和級數

1/1 + 1/2 + 1/3 + 1/4 + ... 在數學上稱為調和級數。 它是發散的,也就是說,只要加上足夠多的項,就可以得到任意大的數字。 但是,它發散的很慢: 前1項和達到 1.0 前4項

藍橋Java語言B真題(省賽)

今天參加藍橋JAVA語言B組的競賽剛剛結束,把真題和大家分享一下。 1.煤球數目  (結果填空) 有一堆煤球,堆成三角稜錐形。具體: 第一層放1個, 第二層3個(排列成三角形), 第三層6個(排列成三角形), 第四層10個(排列成三角形), .... 如果一共有100

2014藍橋JAVA本科B試題三題猜字母

把abcd...s共19個字母組成的序列重複拼接106次,得到長度為2014的串。    接下來刪除第1個字母(即開頭的字母a),以及第3個,第5個等所有奇數位置的字母。    得到的新串再進行刪除奇數位置字母的動作。如此下去,最後只剩下一個字母,請寫出該字母。答案是一個小寫

2014年藍橋JAVA/JAVA++程式設計本科B決賽 出棧次序(結果填空)

出棧次序 X星球特別講究秩序,所有道路都是單行線。一個甲殼蟲車隊,共16輛車,按照編號先後發車,夾在其它車流中,緩緩前行。 路邊有個死衚衕,只能容一輛車通過,是臨時的檢查站,如圖【p1.png】所示。 X星球太死板,要求每輛路過的車必須進入檢查站,也可能不檢查就放行,也可能仔細檢查。 如果車輛進

藍橋java B國賽題目

1.標題:國王的遺產  X國是個小國。國王K有6個兒子。在臨終前,K國王立下遺囑:國王的一批牛作為遺產要分給他的6個兒子。    其中,大兒子分1/4,二兒子1/5,三兒子1/6,....    直到小兒子分1/9。    牛是活的,不能把一頭牛切開分。    最後還剩下11

16藍橋--JAVA語言C-10題-密碼脫落

X星球的考古學家發現了一批古代留下來的密碼。 這些密碼是由A、B、C、D 四種植物的種子串成的序列。 仔細分析發現,這些密碼串當初應該是前後對稱的(也就是我們說的映象串)。 由於年代久遠,其中

藍橋軟體大賽C/C++本科B決賽解題報告

3,訊號匹配     從X星球接收了一個數字訊號序列。     現有一個已知的樣板序列。需要在訊號序列中查詢它首次出現的位置。這類似於串的匹配操作     如果訊號序列較長,樣板序列中重複數字較多,就應當注意比較的策略了。可以仿照串的KMP演算法,進行無回溯的匹配。這種匹配方法的關鍵是構造next陣列。  

藍橋Java題目:猜字母

標題:猜字母 把abcd...s共19個字母組成的序列重複拼接106次,得到長度為2014的串。 接下來刪除第1個字母(即開頭的字母a),以及第3個,第5個等所有奇數位置的字母。 得到的新串再進行刪除奇數位置字母的動作。如此下去,最後只剩下一

藍橋Java B真題——猜字母

package lanqiaobei; /* 標題:猜字母 把abcd...s共19個字母組成的序列重複拼接106次,得到長度為2014的串。 接下來刪除第1個字母(即開頭的字母a),

2016藍橋省賽C試題及部分答案

答案都是自己理解的 1.報紙頁數 X星球日報和我們地球的城市早報是一樣的,都是一些單獨的紙張疊在一起而已。每張紙印有4版。比如,某張報紙包含的4頁是:5,6,11,12,可以確定它應該是最上邊的第2張報紙。我們在太空中撿到了一張X星球的報紙,4個頁碼分別是: 1125,11

藍橋省賽JavaB題圓周率

標題:圓周率    數學發展歷史上,圓周率的計算曾有許多有趣甚至是傳奇的故事。其中許多方法都涉及無窮級數。    圖1.png中所示,就是一種用連分數的形式表示的圓周率求法。    下面的程式實現了該求

藍橋省賽JavaB六題奇怪的分式

標題:奇怪的分式    上小學的時候,小明經常自己發明新演算法。一次,老師出的題目是:    1/4 乘以 8/5     小明居然把分子拼接在一起,分母拼接在一起,答案是:18/45 (參見圖1.pn

2014 藍橋軟體本科A預賽題解(填空及程式碼填空)

第一題: 標題:猜年齡     小明帶兩個妹妹參加元宵燈會。別人問她們多大了,她們調皮地說:“我們倆的年齡之積是年齡之和的6倍”。小明又補充說:“她們可不是雙胞胎,年齡差肯定也不超過8歲啊。”     請你寫出:小明的較小的妹妹的年齡。注意: 只寫一個人的年齡數字,請通

藍橋JAVA語言B_九陣列分數

題目:九陣列分數 1,2,3...9 這九個數字組成一個分數,其值恰好為1/3,如何組法?下面的程式實現了該功能,請填寫劃線部分缺失的程式碼。 public class A { public static void test(int[] x) { int a =

藍橋JAVA語言B_圓周率

標題:圓周率 數學發展歷史上,圓周率的計算曾有許多有趣甚至是傳奇的故事。其中許多方法都涉及無窮級數。  圖1.png中所示,就是一種用連分數的形式表示的圓周率求法。 下面的程式實現了該求解方法。實際上數列的收斂對x的初始值 並不敏感。  結果打印出圓周率近似值(保留小數點後

算法筆記_206:藍橋軟件類決賽真題(Java語言A)

理論 cnblogs 條件 font 9.png 生成 true 突變 幻方 目錄 1 海盜分金幣 2 六角幻方 3 格子放雞蛋 4 排列序數 5 冪一矩陣 6 供水設施 1 海盜分金幣 有5個海盜,相約進行一次帆船比賽。 比賽中天氣發生突變,他們被沖

藍橋省賽Java語言C_移動距離

移動距離 X星球居民小區的樓房全是一樣的,並且按矩陣樣式排列。其樓房的編號為1,2,3... 當排滿一行時,從下一行相鄰的樓往反方向排號。 比如:當小區排號寬度為6時,開始情形如下: 1  2  3

藍橋省賽Java語言C_小題答案

1:58497 2:171700 3:145 4:i + j+2 == k+1 || i + k+2 == j+1 || k + j+2 == i+1 5:s + " " + (char) (i

藍橋 湊算式 C語言 B三題

湊算式      B      DEF A + --- + ------- = 10      C      GHI       (如果顯示有問題,可以參見【圖1.jpg】)             這個算式中A~I代表1~9的數字,不同的字母代表不同的數字。 比如: 6