原題目如下:
1 2 3 4 5 6 7 8 9=110,有這9個數字,數字的位置固定,現在在每個數字之間填入+號或-號或空格,填入空格時爲數字相連起來。
例如有12+34+56+7-8+9=110,無論怎麼填+ - 空格,最後運算的結果=110。
求出所有能運算=110的方案。
這個題,想來不難,但是處理起來也不好處理,題目要求是輸出等式。
我說說我的方法:
把所有能出現的方案全部都列出來,然後做字符串處理,一個個地計算。
一下是我的代碼:
- public class Test10 {
- /**
- * @param args
- */
- public static void main(String[] args) {
- String num = "1 2 3 4 5 6 7 8 9" ; // 要處理的數字,字符串
- String numDemo = num ; // 臨時存放num,用於處理
- int[] ko = {0,0,0,0,0,0,0,0} ; // ko數組用於控制8個空格的“+- ”變化
- int com = 0 ; // 一種狀態下得出的結果,用於判斷是不是110
- for(ko[0] = 0; ko[0] < 3; ko[0]++)
- for(ko[1] = 0; ko[1] < 3; ko[1]++)
- for(ko[2] = 0; ko[2] < 3; ko[2]++)
- for(ko[3] = 0; ko[3] < 3; ko[3]++)
- for(ko[4] = 0; ko[4] < 3; ko[4]++)
- for(ko[5] = 0; ko[5] < 3; ko[5]++)
- for(ko[6] = 0; ko[6] < 3; ko[6]++)
- for(ko[7] = 0; ko[7] < 3; ko[7]++) {
- // 這個用於將numDemo字符串的空格改爲+或-或空格,函數用replaceFirst
- for(int i = 0; i < 8; i++) {
- numDemo = numDemo.replaceFirst(" ", f(ko[i])) ;
- }
- // numArr是存放用+ -分隔開的數字數組,用正則分隔,遇到+或-號是分割,存放到numArr字符串數組中
- String[] numArr = numDemo.split("(\\+|-)") ;
- // 第一個com用於存放第一個numArr的數字,用於下面的計算
- com = Integer.valueOf(numArr[0]) ;
- // up用於控制numArr數組下標移動
- int up = 1 ;
- // 歷遍numDemo字符串,當遇到+或-進入計算
- // 繼續判斷是+號還是-號
- // 是+號就用com+numArr[up],這裏的numArr[up]爲下一個已經在numArr的數
- // 是-號同理
- for(int s = 0; s < numDemo.length()-1; s++) {
- if(numDemo.substring(s, s+1).equals("+") || numDemo.substring(s, s+1).equals("-")) {
- if(numDemo.substring(s, s+1).equals("+")) {
- com += Integer.valueOf(numArr[up]) ;
- up++ ;
- }else {
- com -= Integer.valueOf(numArr[up]) ;
- up++ ;
- }
- }
- }
- // 判斷com==110,輸出numDemo
- if(com == 110) {
- System.out.println(numDemo + "=110") ;
- }
- // 處理完的numDemo繼續還原爲num,用於下次處理
- numDemo = num ;
- }
- }
- /**
- *
- * @param i 傳進來的是ko數組中的值
- * @return 返回的是字符串,只有+ - 空格
- */
- public static String f(int i) {
- if(i == 0) {
- return "" ;
- }else if(i == 1) {
- return "+" ;
- }else if(i == 2) {
- return "-" ;
- }
- return null ;
- }
- }
輸出的方案爲:
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
這些題,說到底就是組合的題目,難就難在怎麼做字符串處理,和各種的轉化問題。原理是很簡單的,也是對編程基礎的一種考查吧!