11年藍橋杯選拔賽Java組第10題

原題目如下:

1 2 3 4 5 6 7 8 9=110,有這9個數字,數字的位置固定,現在在每個數字之間填入+號或-號或空格,填入空格時爲數字相連起來。

例如有12+34+56+7-8+9=110,無論怎麼填+ - 空格,最後運算的結果=110。

求出所有能運算=110的方案。

 

這個題,想來不難,但是處理起來也不好處理,題目要求是輸出等式。

我說說我的方法:

把所有能出現的方案全部都列出來,然後做字符串處理,一個個地計算。

一下是我的代碼:

 

  1. public class Test10 { 
  2.  
  3.     /** 
  4.      * @param args 
  5.      */ 
  6.     public static void main(String[] args) { 
  7.          
  8.         String num = "1 2 3 4 5 6 7 8 9" ; // 要處理的數字,字符串 
  9.         String numDemo = num ; // 臨時存放num,用於處理 
  10.         int[] ko = {0,0,0,0,0,0,0,0} ; // ko數組用於控制8個空格的“+- ”變化 
  11.         int com = 0 ; // 一種狀態下得出的結果,用於判斷是不是110 
  12.          
  13.         for(ko[0] = 0; ko[0] < 3; ko[0]++) 
  14.             for(ko[1] = 0; ko[1] < 3; ko[1]++) 
  15.                 for(ko[2] = 0; ko[2] < 3; ko[2]++) 
  16.                     for(ko[3] = 0; ko[3] < 3; ko[3]++) 
  17.                         for(ko[4] = 0; ko[4] < 3; ko[4]++) 
  18.                             for(ko[5] = 0; ko[5] < 3; ko[5]++) 
  19.                                 for(ko[6] = 0; ko[6] < 3; ko[6]++) 
  20.                                     for(ko[7] = 0; ko[7] < 3; ko[7]++) { 
  21.                                          
  22.                                         // 這個用於將numDemo字符串的空格改爲+或-或空格,函數用replaceFirst 
  23.                                         for(int i = 0; i < 8; i++) { 
  24.                                             numDemo = numDemo.replaceFirst(" ", f(ko[i])) ; 
  25.                                         } 
  26.                                          
  27.                                         // numArr是存放用+ -分隔開的數字數組,用正則分隔,遇到+或-號是分割,存放到numArr字符串數組中 
  28.                                         String[] numArr = numDemo.split("(\\+|-)") ; 
  29.                                         // 第一個com用於存放第一個numArr的數字,用於下面的計算 
  30.                                         com = Integer.valueOf(numArr[0]) ; 
  31.                                         // up用於控制numArr數組下標移動 
  32.                                         int up = 1 ; 
  33.                                          
  34.                                         // 歷遍numDemo字符串,當遇到+或-進入計算 
  35.                                         // 繼續判斷是+號還是-號 
  36.                                         // 是+號就用com+numArr[up],這裏的numArr[up]爲下一個已經在numArr的數 
  37.                                         // 是-號同理 
  38.                                         for(int s = 0; s < numDemo.length()-1; s++) { 
  39.                                             if(numDemo.substring(s, s+1).equals("+") || numDemo.substring(s, s+1).equals("-")) { 
  40.                                                 if(numDemo.substring(s, s+1).equals("+")) { 
  41.                                                     com += Integer.valueOf(numArr[up]) ; 
  42.                                                     up++ ; 
  43.                                                 }else { 
  44.                                                     com -= Integer.valueOf(numArr[up]) ; 
  45.                                                     up++ ; 
  46.                                                 } 
  47.                                             } 
  48.                                         } 
  49.                                          
  50.                                         // 判斷com==110,輸出numDemo 
  51.                                         if(com == 110) { 
  52.                                             System.out.println(numDemo + "=110") ; 
  53.                                         } 
  54.                                          
  55.                                         // 處理完的numDemo繼續還原爲num,用於下次處理 
  56.                                         numDemo = num ; 
  57.                                     } 
  58.     } 
  59.      
  60.     /** 
  61.      *  
  62.      * @param i 傳進來的是ko數組中的值 
  63.      * @return 返回的是字符串,只有+ - 空格 
  64.      */ 
  65.     public static String f(int i) { 
  66.         if(i == 0) { 
  67.             return "" ; 
  68.         }else if(i == 1) { 
  69.             return "+" ; 
  70.         }else if(i == 2) { 
  71.             return "-" ; 
  72.         } 
  73.         return null ; 
  74.     } 
  75.  

輸出的方案爲:

123+4+5+67-89=110 123+4-5-6-7-8+9=110 123-4+5-6-7+8-9=110 123-4-5+6+7-8-9=110 12+34+56+7-8+9=110 12+3+45+67-8-9=110 12-3+4-5+6+7+89=110 1+234-56-78+9=110 1+2+34+5+67-8+9=110 1-2+3+45-6+78-9=110


這些題,說到底就是組合的題目,難就難在怎麼做字符串處理,和各種的轉化問題。原理是很簡單的,也是對編程基礎的一種考查吧!

 

 

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