1. 程式人生 > >團體程式設計天梯賽-習題集部分題解(大牛勿噴)

團體程式設計天梯賽-習題集部分題解(大牛勿噴)

Group program design ladder match - practice set.

L1-001. 列印沙漏

時間限制  400 ms    記憶體限制  65536 kB    程式碼長度限制  8000 B

本題要求你寫個程式把給定的符號列印成沙漏的形狀。例如給定17個“*”,要求按下列格式列印

*****
 ***
  *
 ***
*****

所謂“沙漏形狀”,是指每行輸出奇數個符號;各行符號中心對齊;相鄰兩行符號數差2;符號數先從大到小順序遞減到1,再從小到大順序遞增;首尾符號數相等。

給定任意N個符號,不一定能正好組成一個沙漏。要求打印出的沙漏能用掉儘可能多的符號。

輸入格式:

輸入在一行給出1個正整數N(<=1000)和一個符號,中間以空格分隔。

輸出格式:

首先打印出由給定符號組成的最大的沙漏形狀,最後在一行中輸出剩下沒用掉的符號數。

輸入樣例:

19 *

輸出樣例:

*****
 ***
  *
 ***
*****
2

程式碼如下:

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);

		while (in.hasNext()) {
			int n = in.nextInt();
			String ch = in.nextLine();

			int rem = 0;
			for (int i = 1; i <= n; i++) {
				int Sn = 2 * i * i - 1; 
				rem = n - Sn; 
				if (rem < 4 * i + 2) {
					break;
				}
			}
			int k = (int) Math.sqrt((n - rem + 1) / 2);
			for (int i = k; i >= 1; i--) {
				int p = 1;
				while (p <= k - i) {
					System.out.print(" ");
					p++;
				}
				int j = 1;
				while (j <= 2 * i - 1) {
					System.out.print(ch.substring(1));
					j++;
				}
				System.out.println();
			}
			for (int i = 2; i <= k; i++) {
				int p = 1;
				while (p <= k - i) {
					System.out.print(" ");
					p++;
                        }
				int j = 1;
				while (j <= 2 * i - 1) {
					System.out.print(ch.substring(1));
					j++;
				}
				System.out.println();
			}
			System.out.println(rem);
		}
		in.close();
	}
}

L1-002. 個位數統計

時間限制  400 ms    記憶體限制  65536 kB    程式碼長度限制  8000 B

給定一個k位整數N = dk-1*10k-1 + ... + d1*101 + d0 (0<=di<=9, i=0,...,k-1, dk-1>0),請編寫程式統計每種不同的個位數字出現的次數。例如:給定N = 100311,則有2個0,3個1,和1個3。

輸入格式:

每個輸入包含1個測試用例,即一個不超過1000位的正整數N。

輸出格式:

對N中每一種不同的個位數字,以D:M的格式在一行中輸出該位數字D及其在N中出現的次數M。要求按D的升序輸出。

輸入樣例:

100311

輸出樣例:

0:2
1:3
3:1

程式碼如下:

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);

		while (in.hasNext()) {
			String str = in.nextLine();

			int len = str.length();
			int[] arr = new int[11];
			for (int i = 0; i < len; i++) {
				arr[str.charAt(i) - '0']++;
			}

			for (int i = 0; i < arr.length; i++) {
				if (arr[i] != 0)
					System.out.println(i + ":" + arr[i]);
			}
		}
		in.close();
	}
}
   

L1-003. 考試座位號

時間限制  200 ms    記憶體限制  65536 kB    程式碼長度限制  8000 B  

每個PAT考生在參加考試時都會被分配兩個座位號,一個是試機座位,一個是考試座位。正常情況下,考生在入場時先得到試機座位號碼,入座進入試機狀態後,系統會顯示該考生的考試座位號碼,考試時考生需要換到考試座位就座。但有些考生遲到了,試機已經結束,他們只能拿著領到的試機座位號碼求助於你,從後臺查出他們的考試座位號碼。

輸入格式:

輸入第一行給出一個正整數N(<=1000),隨後N行,每行給出一個考生的資訊:“准考證號 試機座位號 考試座位號”。其中准考證號由14位數字組成,座位從1到N編號。輸入保證每個人的准考證號都不同,並且任何時候都不會把兩個人分配到同一個座位上。

考生資訊之後,給出一個正整數M(<=N),隨後一行中給出M個待查詢的試機座位號碼,以空格分隔。

輸出格式:

對應每個需要查詢的試機座位號碼,在一行中輸出對應考生的准考證號和考試座位號碼,中間用1個空格分隔。

輸入樣例:
4
10120150912233 2 4
10120150912119 4 1
10120150912126 1 3
10120150912002 3 2
2
3 4

輸出樣例:

10120150912002 2
10120150912119 1
程式碼如下:
import java.util.Scanner;

public class Demo {

	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);

		while (in.hasNext()) {
			long[] idArr = new long[1001];
			int[] numArr = new int[1001];

			int N = in.nextInt();                                                      
			for (int i = 0; i < N; i++) {
				long id = in.nextLong();                                            
				int index = in.nextInt();
				int num = in.nextInt();

				idArr[index] = id;
				numArr[index] = num;
			}

			int M = in.nextInt();
			int[] arr = new int[M];
			for (int i = 0; i < M; i++) {
				arr[i] = in.nextInt();
				System.out.println(idArr[arr[i]] + " " + numArr[arr[i]]);
			}

		}
		in.close();
	}

}

L1-004. 念數字

時間限制  400 ms    記憶體限制  65536 kB    程式碼長度限制  8000 B

輸入一個整數,輸出每個數字對應的拼音。當整數為負數時,先輸出“fu”字。十個數字對應的拼音如下:

0: ling
1: yi
2: er
3: san
4: si
5: wu
6: liu
7: qi
8: ba
9: jiu

輸入格式:

輸入在一行中給出一個整數,如: 1234

提示:整數包括負數、零和正數。

輸出格式:

在一行中輸出這個整數對應的拼音,每個數字的拼音之間用空格分開,行末沒有最後的空格。如 yi er san si

輸入樣例:
-600
輸出樣例:
fu liu ling ling

程式碼如下:

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);

		while (in.hasNext()) {
			String str = in.nextLine();

			char[] ch = str.toCharArray();
			String[] newStr = new String[ch.length];
			for (int i = 0; i < ch.length; i++) {
				if (ch[i] == '-') {
					newStr[i] = "fu";
				} else if (ch[i] - '0' == 0) {
					newStr[i] = "ling";
				} else if (ch[i] - '0' == 1) {
					newStr[i] = "yi";
				} else if (ch[i] - '0' == 2) {
					newStr[i] = "er";
				} else if (ch[i] - '0' == 3) {
					newStr[i] = "san";
				} else if (ch[i] - '0' == 4) {
					newStr[i] = "si";
				} else if (ch[i] - '0' == 5) {
					newStr[i] = "wu";
				} else if (ch[i] - '0' == 6) {
					newStr[i] = "liu";
				} else if (ch[i] - '0' == 7) {
					newStr[i] = "qi";
				} else if (ch[i] - '0' == 8) {
					newStr[i] = "ba";
				} else if (ch[i] - '0' == 9) {
					newStr[i] = "jiu";
				}
			}
			
			for (int i = 0; i < newStr.length; i++) {
				if (i == newStr.length - 1) {
					System.out.println(newStr[i]);
				} else {
					System.out.print(newStr[i] + " ");
				}
			}
		}
		in.close();

	}

}

L1-005. 求整數段和

時間限制  400 ms    記憶體限制  65536 kB    程式碼長度限制  8000 B

給定兩個整數A和B,輸出從A到B的所有整數以及這些數的和。

輸入格式:

輸入在一行中給出2個整數A和B,其中-100<=A<=B<=100,其間以空格分隔。

輸出格式:

首先順序輸出從A到B的所有整數,每5個數字佔一行,每個數字佔5個字元寬度,向右對齊。最後在一行中輸出全部數字的和。

輸入樣例:
-3 8
輸出樣例:
   -3   -2   -1    0    1
    2    3    4    5    6
    7    8
Sum = 30

程式碼如下:

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);

		while (in.hasNext()) {
			int beginNum = in.nextInt();
			int endNum = in.nextInt();

			int sum = 0;
			int k = 0;
			for (int i = beginNum; i <= endNum; i++) {
				sum += i;
				System.out.printf("%5d", i);
				k++;
				if (k % 5 == 0) {
					System.out.println();
				} else if (i == endNum) {
					System.out.println();
				}
			}
			System.out.println("sum = " + sum);
		}
		in.close();
	}

}

L1-006. A-B

時間限制  100 ms    記憶體限制  65536 kB    程式碼長度限制  8000 B

本題要求你計算A-B。不過麻煩的是,A和B都是字串 —— 即從字串A中把字串B所包含的字元全刪掉,剩下的字元組成的就是字串A-B。

輸入格式:

輸入在2行中先後給出字串A和B。兩字串的長度都不超過104,並且保證每個字串都是由可見的ASCII碼和空白字元組成,最後以換行符結束。

輸出格式:

在一行中打印出A-B的結果字串。

輸入樣例:
I love GPLT!  It's a fun game!
aeiou
輸出樣例:
I lv GPLT!  It's  fn gm!

程式碼如下:

import java.util.Scanner;

public class Main {

	public static void main(String[] args) throws IOException {
		Scanner cin = new Scanner(System.in);

		BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));

		while (bf.ready()) {
			String s = bf.readLine();
			String ss = bf.readLine();

			System.out.println(s.replaceAll("[" + ss + "]", ""));
		}
		cin.close();
	}

}

L1-007. 跟奧巴馬一起畫方塊(1)

時間限制  400 ms    記憶體限制  65536 kB    程式碼長度限制  8000 B

美國總統奧巴馬不僅呼籲所有人都學習程式設計,甚至以身作則編寫程式碼,成為美國曆史上首位編寫計算機程式碼的總統。2014年底,為慶祝“電腦科學教育周”正式啟動,奧巴馬編寫了很簡單的計算機程式碼:在螢幕上畫一個正方形。現在你也跟他一起畫吧!

輸入格式:

輸入在一行中給出正方形邊長N(3<=N<=21)和組成正方形邊的某種字元C,間隔一個空格。

輸出格式:

輸出由給定字元C畫出的正方形。但是注意到行間距比列間距大,所以為了讓結果看上去更像正方形,我們輸出的行數實際上是列數的50%(四捨五入取整)。

輸入樣例:
10 a
輸出樣例:
aaaaaaaaaa
aaaaaaaaaa
aaaaaaaaaa
aaaaaaaaaa
aaaaaaaaaa
程式碼如下:
import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);

		while (in.hasNext()) {
			int n = in.nextInt();
			String ch = in.next();

			String newStr = "";
			for (int i = 0; i < n; i++) {
				newStr += ch;
			}

			for (int i = 0; i < (float) n / (float) 2; i++) {
				System.out.println(newStr);
			}
		}
		in.close();

	}
}

L1-008. 查驗身份證

時間限制  400 ms    記憶體限制  65536 kB    程式碼長度限制  8000 B

一個合法的身份證號碼由17位地區、日期編號和順序編號加1位校驗碼組成。校驗碼的計算規則如下:

首先對前17位數字加權求和,權重分配為:{7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};然後將計算的和對11取模得到值Z;最後按照以下關係對應Z值與校驗碼M的值:

Z:0 1 2 3 4 5 6 7 8 9 10
M:1 0 X 9 8 7 6 5 4 3 2

現在給定一些身份證號碼,請你驗證校驗碼的有效性,並輸出有問題的號碼。

輸入格式:

輸入第一行給出正整數N(<= 100)是輸入的身份證號碼的個數。隨後N行,每行給出1個18位身份證號碼。

輸出格式:

按照輸入的順序每行輸出1個有問題的身份證號碼。這裡並不檢驗前17位是否合理,只檢查前17位是否全為數字且最後1位校驗碼計算準確。如果所有號碼都正常,則輸出“All passed”。

輸入樣例1:
4
320124198808240056
12010X198901011234
110108196711301866
37070419881216001X
輸出樣例1:
12010X198901011234
110108196711301866
37070419881216001X

輸入樣例2:

2
320124198808240056
110108196711301862
輸出樣例2:
All passed

程式碼如下:

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);

		// 前17位數的權重
		int[] weight = { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 };
		// 校驗碼M的值
		char[] M = { '1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2' };

		while (in.hasNext()) {
			int N = in.nextInt();

			boolean flag = true;
			for (int i = 0; i < N; i++) {
				String str = in.next();
				int sum = 0;
				int is_wor = 0;
				for (int j = 0; j < 17; j++) {
					if (str.charAt(j) - '0' < 0 || str.charAt(j) - '0' > 9) {
						System.out.println(str);
						flag = false;
						is_wor = 1;
						break;
					}
					// 對前17位數字加權求和
					sum += ((str.charAt(j) - '0') * weight[j]);
				}
				// 11取模得到值
				int right = sum % 11;
				char m = M[right];
				// 檢查前17位是否全為數字且最後1位校驗碼計算準確
				if (str.charAt(17) != m && is_wor == 0) {
					flag = false;
					System.out.println(str);
				}
			}
			// 如果所有號碼都正常
			if (flag) {
				System.out.println("All passed");
			}
		}
		in.close();
	}

}

L1-009. 大笨鐘

時間限制  400 ms    記憶體限制  65536 kB    程式碼長度限制  8000 B

微博上有個自稱“大笨鐘V”的傢伙,每天敲鐘催促碼農們愛惜身體早點睡覺。不過由於笨鍾自己作息也不是很規律,所以敲鐘並不定時。一般敲鐘的點數是根據敲鐘時間而定的,如果正好在某個整點敲,那麼“當”數就等於那個整點數;如果過了整點,就敲下一個整點數。另外,雖然一天有24小時,鍾卻是隻在後半天敲1~12下。例如在23:00敲鐘,就是“噹噹噹噹噹噹噹噹噹噹噹”,而到了23:01就會是“噹噹噹噹噹噹噹噹噹噹噹噹”。在午夜00:00到中午12:00期間(端點時間包括在內),笨鍾是不敲的。

下面就請你寫個程式,根據當前時間替大笨鐘敲鍾。

輸入格式:

輸入第一行按照“hh:mm”的格式給出當前時間。其中hh是小時,在00到23之間;mm是分鐘,在00到59之間。

輸出格式:

根據當前時間替大笨鐘敲鍾,即在一行中輸出相應數量個“Dang”。如果不是敲鐘期,則輸出:

Only hh:mm.  Too early to Dang.

其中“hh:mm”是輸入的時間。

輸入樣例1:
19:05
輸出樣例1:
DangDangDangDangDangDangDangDang
輸入樣例2:
07:05
輸出樣例2:
Only 07:05.  Too early to Dang.

程式碼如下:


import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);

		while (in.hasNext()) {
			String str = in.next();

			int hh = (str.charAt(0) - '0') * 10 + str.charAt(1) - '0';
			int mm = (str.charAt(3) - '0') * 10 + str.charAt(4) - '0';

			if (hh <= 12 && mm == 0) {
				System.out.println("Only " + str + ".  Too early to Dang.");
			} else {
				for (int i = 0; i < hh - 12; i++) {
					System.out.print("duang");
				}
				if (mm > 0) {
					System.out.println("duang");
				}
			}
		}
		in.close();
	}
}

L1-010. 誰先倒

時間限制  400 ms    記憶體限制  65536 kB    程式碼長度限制  8000 B

划拳是古老中國酒文化的一個有趣的組成部分。酒桌上兩人划拳的方法為:每人口中喊出一個數字,同時用手比劃出一個數字。如果誰比劃出的數字正好等於兩人喊出的數字之和,誰就輸了,輸家罰一杯酒。兩人同贏或兩人同輸則繼續下一輪,直到唯一的贏家出現。

下面給出甲、乙兩人的酒量(最多能喝多少杯不倒)和划拳記錄,請你判斷兩個人誰先倒。

輸入格式:

輸入第一行先後給出甲、乙兩人的酒量(不超過100的非負整數),以空格分隔。下一行給出一個正整數N(<=100),隨後N行,每行給出一輪划拳的記錄,格式為:

甲喊 甲劃 乙喊 乙劃

其中“喊”是喊出的數字,“劃”是劃出的數字,均為不超過100的正整數(兩隻手一起劃)。

輸出格式:

在第一行中輸出先倒下的那個人:A代表甲,B代表乙。第二行中輸出沒倒的那個人喝了多少杯。題目保證有一個人倒下。注意程式處理到有人倒下就終止,後面的資料不必處理。

輸入樣例:
1 1
6
8 10 9 12
5 10 5 10
3 8 5 12
12 18 1 13
4 16 12 15
15 1 1 16
輸出樣例:
A
1

程式碼如下:

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);

		while (in.hasNext()) {
			int Achol = in.nextInt();
			int Bchol = in.nextInt();

			int jia = Achol, yi = Bchol;
			int n = in.nextInt();
			for (int i = 0; i < n; i++) {
				int Asay = in.nextInt();
				int Aaction = in.nextInt();
				int Bsay = in.nextInt();
				int Baction = in.nextInt();
				if (Aaction == Asay + Bsay && Baction != Asay + Bsay) {
					Achol--;
				}
				if (Aaction != Asay + Bsay && Baction == Asay + Bsay) {
					Bchol--;
				}
				if (Achol == -1) {
					System.out.println("A\n" + (yi - Bchol));
					break;
				}
				if (Bchol == -1) {
					System.out.println("B\n" + (jia - Achol));
					break;
				}
			}
		}
		in.close();
	}
}

L1-011. 帥到沒朋友

時間限制  200 ms    記憶體限制  65536 kB    程式碼長度限制  8000 B

當芸芸眾生忙著在朋友圈中發照片的時候,總有一些人因為太帥而沒有朋友。本題就要求你找出那些帥到沒有朋友的人。

輸入格式:

輸入第一行給出一個正整數N(<=100),是已知朋友圈的個數;隨後N行,每行首先給出一個正整數K(<=1000),為朋友圈中的人數,然後列出一個朋友圈內的所有人——為方便起見,每人對應一個ID號,為5位數字(從00000到99999),ID間以空格分隔;之後給出一個正整數M(<=10000),為待查詢的人數;隨後一行中列出M個待查詢的ID,以空格分隔。

注意:沒有朋友的人可以是根本沒安裝“朋友圈”,也可以是隻有自己一個人在朋友圈的人。雖然有個別自戀狂會自己把自己反覆加進朋友圈,但題目保證所有K超過1的朋友圈裡都至少有2個不同的人。

輸出格式:

按輸入的順序輸出那些帥到沒朋友的人。ID間用1個空格分隔,行的首尾不得有多餘空格。如果沒有人太帥,則輸出“No one is handsome”。

注意:同一個人可以被查詢多次,但只輸出一次。

輸入樣例1:
3
3 11111 22222 55555
2 33333 44444
4 55555 66666 99999 77777
8
55555 44444 10000 88888 22222 11111 23333 88888
輸出樣例1:
10000 88888 23333
輸入樣例2:
3
3 11111 22222 55555
2 33333 44444
4 55555 66666 99999 77777
4
55555 44444 22222 11111
輸出樣例2:
No one is handsome

程式碼如下:

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);

		while (in.hasNext()) {

			Map<Integer, Integer> map = new HashMap<>();
			int n = in.nextInt();
			int key = 0;
			for (int i = 0; i < n; i++) {
				int ni = in.nextInt();
				for (int j = 0; j < ni; j++) {
					key++;
					int id = in.nextInt();
					map.put(key, id);
				}
			}
			boolean flag = true;
			int m = in.nextInt();

			ArrayList<Integer> list = new ArrayList<>();
			for (int i = 0; i < m; i++) {
				int checkId = in.nextInt();
				if (!map.containsValue(checkId)) {
					flag = false;
					if (!list.contains(checkId)) {
						list.add(checkId);
					}
				}
			}
			for (int i = 0; i < list.size(); i++) {
				if (i < list.size() - 1)
					System.out.print(list.get(i) + " ");
				else
					System.out.println(list.get(i));
			}
			if (flag) {
				System.out.println("No one is handsome");
			}
		}
		in.close();
	}
}

L1-012. 輸出GPLT

時間限制  150 ms    記憶體限制  65536 kB    程式碼長度限制  8000 B

給定一個長度不超過10000的、僅由英文字母構成的字串。請將字元重新調整順序,按“GPLTGPLT....”這樣的順序輸出,並忽略其它字元。當然,四種字元(不區分大小寫)的個數不一定是一樣多的,若某種字元已經輸出完,則餘下的字元仍按GPLT的順序列印,直到所有字元都被輸出。

輸入格式:

輸入在一行中給出一個長度不超過10000的、僅由英文字母構成的非空字串。

輸出格式:

在一行中按題目要求輸出排序後的字串。題目保證輸出非空。

輸入樣例:
pcTclnGloRgLrtLhgljkLhGFauPewSKgt
輸出樣例:
GPLTGPLTGLTGLGLL
程式碼如下:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {

	public static void main(String[] args) throws IOException {

		BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));

		while (bf.ready()) {
			String str = bf.readLine();
			String newStr = str.toUpperCase();

			int GCount = 0, PCount = 0, LCount = 0, TCount = 0;
			for (int i = 0; i < newStr.length(); i++) {
				if (newStr.charAt(i) == 'G') {
					GCount++;
				} else if (newStr.charAt(i) == 'P') {
					PCount++;
				} else if (newStr.charAt(i) == 'L') {
					LCount++;
				} else if (newStr.charAt(i) == 'T') {
					TCount++;
				}
			}

			while (GCount > 0 || PCount > 0 || LCount > 0 || TCount > 0) {
				if (GCount > 0) {
					System.out.print("G");
					GCount--;
				}
				if (PCount > 0) {
					System.out.print("P");
					PCount--;
				}
				if (LCount > 0) {
					System.out.print("L");
					LCount--;
				}
				if (TCount > 0) {
					System.out.print("T");
					TCount--;
				}
			}
		}
		bf.close();
	}

}

L1-013. A+B和C 

時間限制 1000 ms     記憶體限制 32768 KB     程式碼長度限制 100 KB 

題目描述

給定區間[-2的31次方, 2的31次方]內的3個整數A、B和C,請判斷A+B是否大於C。
輸入描述:
輸入第1行給出正整數T(<=10),是測試用例的個數。隨後給出T組測試用例,每組佔一行,順序給出A、B和C。整數間以空格分隔。
輸出描述:
對每組測試用例,在一行中輸出“Case #X: true”如果A+B>C,否則輸出“Case #X: false”,其中X是測試用例的編號(從1開始)。
輸入例子:
4

1 2 3

2 3 4

2147483647 0 2147483646

0 -2147483648 -2147483647
輸出例子:
Case #1: false

Case #2: true

Case #3: true

Case #4: false

程式碼如下:

import java.math.BigInteger;
import java.util.Scanner;
 
public class Main {
 
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
 
        while (in.hasNext()) {
            int n = in.nextInt();
            int[] a = new int[n];
            // 輸入n組三個整數
            int i = 0;
            while (n > 0) {
                // 輸入A,B,C
                BigInteger A = in.nextBigInteger();
                BigInteger B = in.nextBigInteger();
                BigInteger C = in.nextBigInteger();
                // 判斷A+B==C
                if (A.add(B).compareTo(C) > 0) {
                    a[i] = 1;
                } else {
                    a[i] = 0;
                }
                i++;
                n--;
            }
            // 輸出結果
            for (int j = 0; j < a.length; j++) {
                if (a[j] == 1) {
                    System.out.println("Case #" + (j + 1) + ": true");
                } else {
                    System.out.println("Case #" + (j + 1) + ": false");
                }
            }
 
        }
        in.close();
    }
 
}

L1-014. 數字分類 

時間限制 1000 ms     記憶體限制 32768 KB     程式碼長度限制 100 KB 

題目描述

給定一系列正整數,請按要求對數字進行分類,並輸出以下5個數字:

A1 = 能被5整除的數字中所有偶數的和;

A2 = 將被5除後餘1的數字按給出順序進行交錯求和,即計算n1-n2+n3-n4...;

A3 = 被5除後餘2的數字的個數;

A4 = 被5除後餘3的數字的平均數,精確到小數點後1位;

A5 = 被5除後餘4的數字中最大數字。
輸入描述:
每個輸入包含1個測試用例。每個測試用例先給出一個不超過1000的正整數N,隨後給出N個不超過1000的待分類的正整數。數字間以空格分隔。
輸出描述:
對給定的N個正整數,按題目要求計算A1~A5並在一行中順序輸出。數字間以空格分隔,但行末不得有多餘空格。

若其中某一類數字不存在,則在相應位置輸出“N”。
輸入例子:
13 1 2 3 4 5 6 7 8 9 10 20 16 18
輸出例子:
30 11 2 9.7 9
程式碼如下:
import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);

		while (in.hasNext()) {
			int N = in.nextInt();
			int A1 = 0, A2 = 0, A3 = 0, A4 = 0, A5 = 0;
			int count1 = 0, count2 = 0, count3 = 0, count4 = 0, count5 = 0;
			for (int i = 1; i <= N; i++) {
				int n = in.nextInt();
				if (n % 5 == 0 && n % 2 == 0) {
					A1 += n;
					count1++;
				} else if (n % 5 == 1) {
					if ((count2 + 2) % 2 == 0) {
						A2 += n;
					} else {
						A2 -= n;
					}
					count2++;
				} else if (n % 5 == 2) {
					A3++;
					count3++;
				} else if (n % 5 == 3) {
					A4 += n;
					count4++;
				} else if (n % 5 == 4) {
					if (n > A5)
						A5 = n;
					count5++;
				}
			}
			float A4Sum = (float) A4 / (float) count4;
			String aver = String.format("%.1f", A4Sum);
			System.out.print(count1 == 0 ? "N" : A1);
			System.out.print(" " + (count2 == 0 ? "N" : A2));
			System.out.print(" " + (count3 == 0 ? "N" : A3));
			System.out.print(" " + (count4 == 0 ? "N" : aver));
			System.out.println(" " + (count5 == 0 ? "N" : A5));
		}
		in.close();
	}
}

L1-015. 數素數

時間限制 1000 ms     記憶體限制 32768 KB     程式碼長度限制 100 KB

題目描述

令Pi表示第i個素數。現任給兩個正整數M <= N <= 10000,請輸出PM到PN的所有素數。
輸入描述:
輸入在一行中給出M和N,其間以空格分隔。
輸出描述:
輸出從PM到PN的所有素數,每10個數字佔1行,其間以空格分隔,但行末不得有多餘空格。
輸入例子:
5 27
輸出例子:
11 13 17 19 23 29 31 37 41 43

47 53 59 61 67 71 73 79 83 89

97 101 103
程式碼如下:
import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);

		while (in.hasNext()) {
			int M = in.nextInt();
			int N = in.nextInt();
			int[] primeArr = new int[N - M + 1];
			int count = 0;
			int i = 0;
			// 獲得第M到第N個素數
			for (int j = 2;; j++) {
				if (i == (N - M) + 1) {
					break;
				} else {
					if (prime(j)) {
						count++;
						if (count >= M) {
							primeArr[i] = j;
							i++;
						}
					}
				}
			}
			// 輸出陣列
			int k = 1;
			for (int j = 0; j < i; j++) {
				if (k % 10 == 0) {
					System.out.println(primeArr[j]);
				} else if (j == i - 1) {
					System.out.print(primeArr[j]);
				} else {
					System.out.print(primeArr[j] + " ");
				}
				k++;
			}
		}
		in.close();

	}

	/**
	 * 功能:判斷是否為素數
	 * 
	 * @param 需判斷的引數
	 * @return 返回boolean值
	 */
	private static boolean prime(int j) {
		for (int i = 2; i <= j / 2; i++) {
			if (j % i == 0)
				return false;
		}
		return true;
	}

}

L1-016. 部分A+B 

時間限制 1000 ms     記憶體限制 32768 KB     程式碼長度限制 100 KB 

題目描述

正整數A的“DA(為1位整數)部分”定義為由A中所有DA組成的新整數PA。例如:給定A = 3862767,DA = 6,則A的“6部分”PA是66,因為A中有2個6。
 
 現給定A、DA、B、DB,請編寫程式計算PA + PB
輸入描述:
輸入在一行中依次給出A、DA、B、DB,中間以空格分隔,其中0 < A, B < 1010
輸出描述:
在一行中輸出PA + PB的值。
輸入例子:
3862767 6 13530293 3
輸出例子:
399
程式碼如下:
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner cin = new Scanner(System.in);
		int A = cin.nextInt();
		int DA = cin.nextInt();
		int B = cin.nextInt();
		int DB = cin.nextInt();
		int count_A = 0;
		int count_B = 0;
		int res_A = 0;
		int res_B = 0;
		while (A != 0) {
			if (DA == A % 10) {
				count_A++;
			}
			A /= 10;
		}
		while (B != 0) {
			if (DB == B % 10) {
				count_B++;
			}
			B /= 10;
		}
		for (int i = 0; i < count_A; i++) {
			res_A = res_A * 10 + DA;
		}
		for (int i = 0; i < count_B; i++) {
			res_B = res_B * 10 + DB;
		}
		System.out.println(res_A + res_B);
	}
}

L1-017. 錘子剪刀布 

時間限制 1000 ms     記憶體限制 32768 KB     程式碼長度限制 100 KB     

題目描述

大家應該都會玩“錘子剪刀布”的遊戲:

現給出兩人的交鋒記錄,請統計雙方的勝、平、負次數,並且給出雙方分別出什麼手勢的勝算最大。
輸入描述:
輸入第1行給出正整數N(<=105),即雙方交鋒的次數。隨後N行,每行給出一次交鋒的資訊,即甲、乙雙方同時給出的的手勢。C代表“錘子”、J代表“剪刀”、B代

表“布”,第1個字母代表甲方,第2個代表乙方,中間有1個空格。
輸出描述:
輸出第1、2行分別給出甲、乙的勝、平、負次數,數字間以1個空格分隔。第3行給出兩個字母,分別代表甲、乙獲勝次數最多的手勢,中間有1個空格。如果解不唯

一,則輸出按字母序最小的解。
輸入例子:
10

C J

J B

C B

B B

B C

C C

C B

J B

B C

J J
輸出例子:
5 3 2

2 3 5

B B
程式碼如下:
import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);

		while (in.hasNext()) {
			int n = in.nextInt();
			int rel = 0;
			int AWin = 0, BWin = 0;
			int AWinByC = 0, AWinByB = 0, AWinByJ = 0;
			int BWinByC = 0, BWinByB = 0, BWinByJ = 0;
			for (int i = 0; i < n; i++) {
				String AShow = in.next(); // 甲
				String BShow = in.next(); // 乙
				// 1.雙方打平
				if (AShow.equals(BShow)) {
					rel++;
				}
				// 2.甲出錘子時
				else if (AShow.equals("C")) {
					// 甲勝
					if (BShow.equals("J")) {
						AWin++;
						AWinByC++;
					} else {
						// 乙勝
						BWin++;
						BWinByB++;
					}
				}
				// 3.甲出剪刀時
				else if (AShow.equals("J")) {
					// 甲勝
					if (BShow.equals("B")) {
						AWin++;
						AWinByJ++;
					} else {
						// 乙勝
						BWin++;
						BWinByC++;
					}
				}
				// 4.甲出剪刀時
				else if (AShow.equals("B")) {
					// 甲勝
					if (BShow.equals("C")) {
						AWin++;
						AWinByB++;
					} else {
						// 乙勝
						BWin++;
						BWinByJ++;
					}
				}

			}
			// 輸出甲乙的戰績分析表
			System.out.println(AWin + " " + rel + " " + (n - AWin - rel));
			System.out.println(BWin + " " + rel + " " + (n - BWin - rel));
			// 排序通過哪個贏的機率
			int AWinCountBy = sort(AWinByC, AWinByJ, AWinByB);
			int BWinCountBy = sort(BWinByC, BWinByJ, BWinByB);

			// 甲贏的絕招
			if (AWinCountBy == AWinByB) {
				System.out.print("B ");
			} else if (AWinCountBy == AWinByC) {
				System.out.print("C ");
			} else {
				System.out.print("J ");
			}
			// 乙贏的絕招
			if (BWinCountBy == BWinByB) {
				System.out.println("B");
			} else if (BWinCountBy == BWinByC) {
				System.out.println("C");
			} else {
				System.out.println("J");
			}
		}
		in.close();
	}

	/**
	 * 獲得三個數的最大值
	 * 
	 * @param aWinByC
	 * @param aWinByJ
	 * @param aWinByB
	 * @return 返回最大值
	 */
	private static int sort(int aWinByC, int aWinByJ, int aWinByB) {
		int max = 0;
		if (aWinByJ > aWinByC)
			max = aWinByJ;
		else
			max = aWinByC;
		if (aWinByB > max)
			max = aWinByB;
		return max;
	}

}

L1-018. 月餅 

時間限制 1000 ms     記憶體限制 32768 KB     程式碼長度限制 100 KB 

題目描述

月餅是中國人在中秋佳節時吃的一種傳統食品,不同地區有許多不同風味的月餅。現給定所有種類月餅的庫存量、總售價、以及市場的最大需

求量,請你計算可以獲得的最大收益是多少。

注意:銷售時允許取出一部分庫存。樣例給出的情形是這樣的:假如我們有3種月餅,其庫存量分別為18、15、10萬噸,總售價分別為75、

72、45億元。如果市場的最大需求量只有20萬噸,那麼我們最大收益策略應該是賣出全部15萬噸第2種月餅、以及5萬噸第3種月餅,獲得

 72 + 45/2 = 94.5(億元)。
輸入描述:
每個輸入包含1個測試用例。每個測試用例先給出一個不超過1000的正整數N表示月餅的種類數、以及不超過500(以萬噸為單位)的正整數

D表示市場最大需求量。隨後一行給出N個正數表示每種月餅的庫存量(以萬噸為單位);最後一行給出N個正數表示每種月餅的總售價(以億

元為單位)。數字間以空格分隔。
輸出描述:
對每組測試用例,在一行中輸出最大收益,以億元為單位並精確到小數點後2位。
輸入例子:
3 20

18 15 10

75 72 45
輸出例子:
94.50
程式碼如下:
import java.util.Arrays;
import java.util.Scanner;

//設定類用於儲存月餅的總價、庫存量,以及計算其單價
class moCake implements Comparable<moCake>{
	int totalValue;
	int repertories;
	double price;
	@Override
	public int compareTo(moCake m) {
		//設定月餅的排序為單價從大到小的順序
		return this.price>m.price ? -1:1;
	}
}

public class Main {
	
	public static void main(String[] args) {

		Scanner in = new Scanner(System.in);
		//月餅種類數量,以及需求數量
		int num = in.nextInt();
		int requirement = in.nextInt();

		moCake[]  mc = new moCake[num];
		for (int i = 0; i < mc.length; i++) {
			//對物件操作之前,先將其例項化
			mc[i] = new moCake();
			mc[i].repertories = in.nextInt();
		}
		for (int i = 0; i < mc.length; i++) {
			mc[i].totalValue = in.nextInt();
		}
		in.close();
		//計算每個月餅的單價
		for (int i = 0; i < mc.length; i++) {
			mc[i].price = (double) mc[i].totalValue / mc[i].repertories;
		}
		//對月餅陣列進行排序
		Arrays.sort(mc);
		
		double earning = 0.0;
		//從月餅單價最大開始遍歷,直接滿足需求
		for(int i = 0; i < mc.length; i++) {
			if (requirement > mc[i].repertories) {
				earning += mc[i].totalValue;
				requirement -= mc[i].repertories;
			}else {
				earning += ((double)requirement/mc[i].repertories) * mc[i].totalValue;
				break;
			}
		}
		System.out.printf("%.2f\n",earning);//格式化輸出
	}

}

L1-019. D進位制的A+B 

時間限制 1000 ms     記憶體限制 32768 KB     程式碼長度限制 100 KB 

題目描述

輸入兩個非負10進位制整數A和B(<=230-1),輸出A+B的D (1 < D <= 10)進位制數。
輸入描述:
輸入在一行中依次給出3個整數A、B和D。
輸出描述:
輸出A+B的D進位制數。
輸入例子:
123 456 8
輸出例子:
1103
程式碼如下:
import java.math.BigInteger;
import java.util.Scanner;

public class Main {

	public static void main(String[] args) {

		Scanner in = new Scanner(System.in);

		while (in.hasNext()) {
			BigInteger A = in.nextBigInteger();
			BigInteger B = in.nextBigInteger();
			BigInteger change = in.nextBigInteger();

			BigInteger[] rem = new BigInteger[100];

			int i = 0;
			BigInteger temp = A.add(B);
			while (temp.compareTo(BigInteger.ZERO) > 0) {
				i++;
				rem[i] = temp.remainder(change);
				temp = temp.divide(change);
			}

			for (int j = i; j > 0; j--) {
				System.out.print(rem[j]);
			}
		}
		in.close();
	}

}

L1-020. 跟奧巴馬一起程式設計(2)

時間限制 1000 ms 記憶體限制 32768 KB 程式碼長度限制 100 KB

題目描述

美國總統奧巴馬不僅呼籲所有人都學習程式設計,甚至以身作則編寫程式碼,成為美國曆史上首位編寫計算機程式碼的總統。2014年底,為慶祝“計算

機科學教育周”正式啟動,奧巴馬編寫了很簡單的計算機程式碼:在螢幕上畫一個正方形。現在你也跟他一起畫吧!
輸入描述:
輸入在一行中給出正方形邊長N(3<=N<=20)和組成正方形邊的某種字元C,間隔一個空格。
輸出描述:
輸出由給定字元C畫出的正方形。但是注意到行間距比列間距大,所以為了讓結果看上去更像正方形,我們輸出的行數實際上是列數的50%

(四捨五入取整)。
輸入例子:
10 a
輸出例子:
aaaaaaaaaa

a a

a a

a a

aaaaaaaaaa
程式碼如下:
import java.util.Scanner;

public class Main {
    
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		int n = in.nextInt();
		String c = in.next();
		double m;
		double m1 = n / 2.0;
		int m2 = n / 2;
		if ((m1 - m2) >= 0.5) {
			m = m2 + 1;
		} else {
			m = m2;
		}
		//
		for (int i = 0; i < n; i++) {
			System.out.print(c);
		}
		System.out.println();
		for (int i = 0; i < m - 2; i++) {
			System.out.print(c);
			for (int j = 0; j < n - 2; j++) {
				System.out.print(" ");
			}
			System.out.print(c);
			System.out.println();
		}
		for (int i = 0; i < n; i++) {
			System.out.print(c);
		}
	}
}