第八屆藍橋杯Java C組決賽試題
阿新 • • 發佈:2019-01-23
1.標題:數位和
數學家高斯很小的時候就天分過人。一次老師指定的算數題目是:1+2+...+100。
高斯立即做出答案:5050!
這次你的任務是類似的。但並非是把一個個的數字加起來,而是對該數字的每一個數位作累加。
這樣從1加到100的“和”是:901
從10加到15是:21,也就是:1+0+1+1+1+2+1+3+1+4+1+5,這個口算都可以出結果的。
按這樣的“加法”,從1加到1000是多少呢? 請通過瀏覽器提交該結果。
當然,我們並不期望你能像高斯一樣,發現數字背後深奧的祕密,只要請計算機幫忙,一切都easy!
w星球的長老交給小明一個任務:
1,2,3...16 這16個數字分為兩組。
要求:
這兩組數字的和相同,
並且,兩組數字的平方和也相同,
並且,兩組數字的立方和也相同。
請你利用計算機的強大搜索能力解決這個問題。
並提交1所在的那個分組的所有數字。
這些數字要從小到大排列,兩個數字間用一個空格分開。
即類似:1 4 5 8 ... 這樣的答案。
注意,只提交這一組數字,不要填寫任何多餘的內容。
----------------------------------------
笨笨有話說:
只要一個組的成員確定了,另一個組的成員也就確定了。列舉一個組的成員就可以了。
憑直覺,兩個組的成員數目不會差太多吧。
歪歪有話說:
既然求 1 所在的那個組,那隻要列舉剩餘的成員就可以了。
+--root
+--dog
| +--AAdog
| | +--AAdog01
| | +--AAdog02
| +--BBdog
| +--CCdog
+--cat
| +--XXcat
| | +--XXcat-oo
| | +--XXcat-qq
| | +--XXcat-qq-hahah
| +--YYcat
| +--YYcat.hello
| +--YYcat.yes
| +--YYcat.me
+--duck
+--TTduck
+--TTduck-001
+--TTduck-002
+--TTduck-003
我們知道,整數做除法時,有時得到有限小數,有時得到無限迴圈小數。
如果我們把有限小數的末尾加上無限多個0,它們就有了統一的形式。
本題的任務是:在上面的約定下,求整數除法小數點後的第n位開始的3位數。
輸入:
一行三個整數:a b n,用空格分開。a是被除數,b是除數,n是所求的小數後位置(0<a,b,n<1000000000)
輸出:
一行3位數字,表示:a除以b,小數後第n位開始的3位數字。
比如:
輸入:
1 8 1
程式應該輸出:
125
再比如:
輸入:
1 8 3
程式應該輸出:
500
再比如:
輸入:
282866 999000 6
程式應該輸出:
914
資源約定:
峰值記憶體消耗 < 256M
CPU消耗 < 1000ms
請嚴格按要求輸出,不要畫蛇添足地列印類似:“請您輸入...” 的多餘內容。
所有程式碼放在同一個原始檔中,除錯通過後,拷貝提交該原始碼。
注意:不要使用package語句。不要使用jdk1.7及以上版本的特性。
n個人參加某項特殊考試。
為了公平,要求任何兩個認識的人不能分在同一個考場。
求是少需要分幾個考場才能滿足條件。
輸入格式:
第一行,一個整數n(1<n<100),表示參加考試的人數。
第二行,一個整數m,表示接下來有m行資料
以下m行每行的格式為:兩個整數a,b,用空格分開 (1<=a,b<=n) 表示第a個人與第b個人認識。
輸出格式:
一行一個整數,表示最少分幾個考場。
例如:
輸入:
5
8
1 2
1 3
1 4
2 3
2 4
2 5
3 4
4 5
程式應該輸出:
4
再比如:
輸入:
5
10
1 2
1 3
1 4
1 5
2 3
2 4
2 5
3 4
3 5
4 5
則程式應該輸出:
5
資源約定:
峰值記憶體消耗 < 256M
CPU消耗 <
數學家高斯很小的時候就天分過人。一次老師指定的算數題目是:1+2+...+100。
高斯立即做出答案:5050!
這次你的任務是類似的。但並非是把一個個的數字加起來,而是對該數字的每一個數位作累加。
這樣從1加到100的“和”是:901
從10加到15是:21,也就是:1+0+1+1+1+2+1+3+1+4+1+5,這個口算都可以出結果的。
按這樣的“加法”,從1加到1000是多少呢? 請通過瀏覽器提交該結果。
當然,我們並不期望你能像高斯一樣,發現數字背後深奧的祕密,只要請計算機幫忙,一切都easy!
注意:你需要提交的是一個整數,不要填寫任何多餘的內容(比如:說明性文字)
答案:13501
2.標題:數字劃分import java.util.*; public class Main { public static int f(int num) { String str=String.valueOf(num); int res=0; for(int i=0;i<str.length();i++) { res+=str.charAt(i)-'0'; } return res; } public static void main(String[] args) { int count=0; for(int i=0;i<=1000;i++) { count+=f(i); } System.out.println(count); } }
w星球的長老交給小明一個任務:
1,2,3...16 這16個數字分為兩組。
要求:
這兩組數字的和相同,
並且,兩組數字的平方和也相同,
並且,兩組數字的立方和也相同。
請你利用計算機的強大搜索能力解決這個問題。
並提交1所在的那個分組的所有數字。
這些數字要從小到大排列,兩個數字間用一個空格分開。
即類似:1 4 5 8 ... 這樣的答案。
注意,只提交這一組數字,不要填寫任何多餘的內容。
----------------------------------------
笨笨有話說:
只要一個組的成員確定了,另一個組的成員也就確定了。列舉一個組的成員就可以了。
憑直覺,兩個組的成員數目不會差太多吧。
歪歪有話說:
既然求 1 所在的那個組,那隻要列舉剩餘的成員就可以了。
貌似都是8個成員的可能性很大啊。
思路:根據題目的暗示陣列長度為8,寫個排列即可。
答案:[1, 4, 6, 7, 10, 11, 13, 16]
import java.util.*; public class Main { static ArrayList<Integer> tmpArr = new ArrayList<>(); public static boolean test(ArrayList<Integer> a) { for(int k=1;k<=3;k++) { int num1 = 0; int num2 = 0; for (int i = 1; i <= 16; i++) { if(a.contains(i)) { num1+=Math.pow(i,k); } else { num2+=Math.pow(i,k); } } if (num1 != num2) { return false; } } return true; } public static void combine(int index,int k,int []arr) { if(k == 1){ for (int i = index; i < arr.length; i++) { tmpArr.add(arr[i]); if(test(tmpArr)) System.out.print(tmpArr.toString()+" "); tmpArr.remove((Object)arr[i]); } }else if(k > 1){ for (int i = index; i <= arr.length - k; i++) { tmpArr.add(arr[i]); //tmpArr都是臨時性儲存一下 combine(i + 1,k - 1, arr); //索引右移,內部迴圈,自然排除已經選擇的元素 tmpArr.remove((Object)arr[i]); //tmpArr因為是臨時儲存的,上一個組合找出後就該釋放空間,儲存下一個元素繼續拼接組合了 } }else{ return ; } } public static void main(String[] args) { int a[]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}; combine(0,8,a); } }
3.標題:樹形顯示
對於分類結構可以用樹形來形象地表示。比如:檔案系統就是典型的例子。
樹中的結點具有父子關係。我們在顯示的時候,把子項向右縮排(用空格,不是tab),並新增必要的連線線,以使其層次關係更醒目。
下面的程式碼就是為了這個目的的,請仔細閱讀原始碼,並填寫劃線部分缺少的程式碼。
- import java.util.*;
- class MyTree
- {
- private Map<String, List<String>> map_ch = new HashMap<String, List<String>>();
- private Map<String,String> map_pa = new HashMap<String,String>();
- publicvoid add(String parent, String child)
- {
- map_pa.put(child, parent);
- List<String> lst = map_ch.get(parent);
- if(lst==null){
- lst = new ArrayList<String>();
- map_ch.put(parent, lst);
- }
- lst.add(child);
- }
- public String get_parent(String me){
- return map_pa.get(me);
- }
- public List<String> get_child(String me){
- return map_ch.get(me);
- }
- private String space(int n)
- {
- String s = "";
- for(int i=0; i<n; i++) s += ' ';
- return s;
- }
- privateboolean last_child(String x){
- String pa = map_pa.get(x);
- if(pa==null) returntrue;
- List<String> lst = map_ch.get(pa);
- return lst.get(lst.size()-1).equals(x);
- }
- publicvoid show(String x){
- String s = "+--" + x;
- String pa = x;
- while(true){
- pa = map_pa.get(pa);
- if(pa==null) break;
- s = ___________________________________ ; // 填空
- }
- System.out.println(s);
- }
- publicvoid dfs(String x){
- show(x);
- List<String> lst = map_ch.get(x);
- if(lst==null) return;
- for(String it: lst){
- dfs(it);
- }
- }
- }
- publicclass TreeView
- {
- publicstaticvoid main(String[] args)
- {
- MyTree tree = new MyTree();
- tree.add("root", "dog");
- tree.add("root", "cat");
- tree.add("root", "duck");
- tree.add("dog", "AAdog");
- tree.add("dog", "BBdog");
- tree.add("dog", "CCdog");
- tree.add("AAdog", "AAdog01");
- tree.add("AAdog", "AAdog02");
- tree.add("cat", "XXcat");
- tree.add("cat", "YYcat");
- tree.add("XXcat","XXcat-oo");
- tree.add("XXcat","XXcat-qq");
- tree.add("XXcat-qq", "XXcat-qq-hahah");
- tree.add("duck", "TTduck");
- tree.add("TTduck", "TTduck-001");
- tree.add("TTduck", "TTduck-002");
- tree.add("TTduck", "TTduck-003");
- tree.add("YYcat","YYcat.hello");
- tree.add("YYcat","YYcat.yes");
- tree.add("YYcat","YYcat.me");
- tree.dfs("root");
- }
- }
+--root
+--dog
| +--AAdog
| | +--AAdog01
| | +--AAdog02
| +--BBdog
| +--CCdog
+--cat
| +--XXcat
| | +--XXcat-oo
| | +--XXcat-qq
| | +--XXcat-qq-hahah
| +--YYcat
| +--YYcat.hello
| +--YYcat.yes
| +--YYcat.me
+--duck
+--TTduck
+--TTduck-001
+--TTduck-002
+--TTduck-003
如有平字型對齊問題,可以參見圖【p1.png】
注意,只填寫劃線部分缺少的程式碼,不要抄寫已有的程式碼或符號。
答案:
- s=last_child(pa)? " " + s: "| " + s;
思路:一看show函式就想到是問怎麼列印,先試下s="",發現逐行列印,那麼問題就很簡單了,只要在根節點前面加“| ",子節點加" "就行了。
4.標題: 小數第n位我們知道,整數做除法時,有時得到有限小數,有時得到無限迴圈小數。
如果我們把有限小數的末尾加上無限多個0,它們就有了統一的形式。
本題的任務是:在上面的約定下,求整數除法小數點後的第n位開始的3位數。
輸入:
一行三個整數:a b n,用空格分開。a是被除數,b是除數,n是所求的小數後位置(0<a,b,n<1000000000)
輸出:
一行3位數字,表示:a除以b,小數後第n位開始的3位數字。
比如:
輸入:
1 8 1
程式應該輸出:
125
再比如:
輸入:
1 8 3
程式應該輸出:
500
再比如:
輸入:
282866 999000 6
程式應該輸出:
914
資源約定:
峰值記憶體消耗 < 256M
CPU消耗 < 1000ms
請嚴格按要求輸出,不要畫蛇添足地列印類似:“請您輸入...” 的多餘內容。
所有程式碼放在同一個原始檔中,除錯通過後,拷貝提交該原始碼。
注意:不要使用package語句。不要使用jdk1.7及以上版本的特性。
注意:主類的名字必須是:Main,否則按無效程式碼處理。
思路:難點在於判斷迴圈小數段
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
double a,b,n;
double sa,sn,count;
a=in.nextInt();
b=in.nextInt();
n=in.nextInt();
sn = n;
sa = a % b; // 此時的sa*10對b取餘後得到小數點後第一位
count = 0;
while(sn>0)
{
if(sa == b) //取餘之後會等於零
break;
if(sa < b)
{
sa = sa * 10;
}
else
{
//除法法則,逐步運算
sa = sa % b;
sa = sa * 10;
if(sa==0)
break; //後面都是零則直接跳出迴圈
}
count++;
if(sa % b == a % b) // 減掉迴圈的數
{
sn = n % count;
}
sn--;
}
if(sa==0)
{
System.out.print("000");
}
else
{
int i = 3;
while(i>0)
{
System.out.print((int)(sa / b));//逐步輸出n後三位的每一位
sa = sa % b;
sa = sa * 10;
i--;
}
}
}
}
5.標題:分考場n個人參加某項特殊考試。
為了公平,要求任何兩個認識的人不能分在同一個考場。
求是少需要分幾個考場才能滿足條件。
輸入格式:
第一行,一個整數n(1<n<100),表示參加考試的人數。
第二行,一個整數m,表示接下來有m行資料
以下m行每行的格式為:兩個整數a,b,用空格分開 (1<=a,b<=n) 表示第a個人與第b個人認識。
輸出格式:
一行一個整數,表示最少分幾個考場。
例如:
輸入:
5
8
1 2
1 3
1 4
2 3
2 4
2 5
3 4
4 5
程式應該輸出:
4
再比如:
輸入:
5
10
1 2
1 3
1 4
1 5
2 3
2 4
2 5
3 4
3 5
4 5
則程式應該輸出:
5
資源約定:
峰值記憶體消耗 < 256M
CPU消耗 <