1. 程式人生 > >第八屆藍橋杯Java C組決賽試題

第八屆藍橋杯Java C組決賽試題

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!


注意:你需要提交的是一個整數,不要填寫任何多餘的內容(比如:說明性文字)

答案:13501

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);
    }
}
2.標題:數字劃分


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),並新增必要的連線線,以使其層次關係更醒目。


下面的程式碼就是為了這個目的的,請仔細閱讀原始碼,並填寫劃線部分缺少的程式碼。

  1. import java.util.*;  
  2. class MyTree  
  3. {  
  4.     private Map<String, List<String>>  map_ch = new HashMap<String, List<String>>();  
  5.     private Map<String,String> map_pa = new HashMap<String,String>();  
  6.     publicvoid add(String parent, String child)  
  7.     {  
  8.         map_pa.put(child, parent);  
  9.         List<String> lst = map_ch.get(parent);  
  10.         if(lst==null){  
  11.             lst = new ArrayList<String>();  
  12.             map_ch.put(parent, lst);  
  13.         }  
  14.         lst.add(child);  
  15.     }  
  16.     public String get_parent(String me){  
  17.         return map_pa.get(me);  
  18.     }  
  19.     public List<String> get_child(String me){  
  20.         return map_ch.get(me);  
  21.     }  
  22.     private String space(int n)  
  23.     {  
  24.         String s = "";  
  25.         for(int i=0; i<n; i++) s += ' ';  
  26.         return s;  
  27.     }  
  28.     privateboolean last_child(String x){  
  29.         String pa = map_pa.get(x);  
  30.         if(pa==nullreturntrue;  
  31.         List<String> lst = map_ch.get(pa);  
  32.         return lst.get(lst.size()-1).equals(x);  
  33.     }  
  34.     publicvoid show(String x){  
  35.         String s = "+--" + x;  
  36.         String pa = x;  
  37.         while(true){  
  38.             pa = map_pa.get(pa);  
  39.             if(pa==nullbreak;  
  40.             s = ___________________________________ ;  // 填空
  41.         }  
  42.         System.out.println(s);  
  43.     }  
  44.     publicvoid dfs(String x){  
  45.         show(x);  
  46.         List<String> lst = map_ch.get(x);  
  47.         if(lst==nullreturn;  
  48.         for(String it: lst){  
  49.             dfs(it);  
  50.         }  
  51.     }  
  52. }  
  53. publicclass TreeView  
  54. {  
  55.     publicstaticvoid main(String[] args)  
  56.     {  
  57.         MyTree tree = new MyTree();  
  58.         tree.add("root""dog");  
  59.         tree.add("root""cat");  
  60.         tree.add("root""duck");  
  61.         tree.add("dog""AAdog");  
  62.         tree.add("dog""BBdog");  
  63.         tree.add("dog""CCdog");  
  64.         tree.add("AAdog""AAdog01");  
  65.         tree.add("AAdog""AAdog02");  
  66.         tree.add("cat""XXcat");  
  67.         tree.add("cat""YYcat");  
  68.         tree.add("XXcat","XXcat-oo");  
  69.         tree.add("XXcat","XXcat-qq");  
  70.         tree.add("XXcat-qq""XXcat-qq-hahah");  
  71.         tree.add("duck""TTduck");  
  72.         tree.add("TTduck""TTduck-001");  
  73.         tree.add("TTduck""TTduck-002");  
  74.         tree.add("TTduck""TTduck-003");  
  75.         tree.add("YYcat","YYcat.hello");  
  76.         tree.add("YYcat","YYcat.yes");  
  77.         tree.add("YYcat","YYcat.me");         
  78.         tree.dfs("root");  
  79.     }  
  80. }  
對於題目中的測試資料,輸出結果:
+--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】


注意,只填寫劃線部分缺少的程式碼,不要抄寫已有的程式碼或符號。

答案:

  1. 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消耗  <