<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    wangflood

    精心維護一個技術blog,為了工作,也是愛好。

      BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
      14 Posts :: 19 Stories :: 8 Comments :: 0 Trackbacks
    前些日子在群里討論,有一個哥們出一道題:5,6,7,8,9,10按順序插入+-*/和括號,得到結果2000.
    大家的先沉默了一會,二分鐘后,有人說這題沒意思。呵呵。口算還是有點難的。于是我說,可以寫個程序試一試。結果,花了三個小時,寫完了
    import java.util.HashSet;
    import java.util.Iterator;
    import java.util.Set;

    /**
     * 
    @author Sam Wang
     * 
    @since Mar 22, 2011
     
    */
    public class Demo {

        
    public static void main(String[] args) {

            
    double[] arr = { 5678910 };
            
    double[] arrTemp = null;
            
    int random = 0;
            
    double last = 0;
            StringBuffer sb 
    = null;
            Set
    <String> results = new HashSet<String>();

            
    for (int i = 0; i < 100000; i++) {
                arrTemp 
    = arr.clone();
                shuffle(arrTemp);
                sb 
    = new StringBuffer();
                sb.append(arrTemp[
    0]);
                
    for (int j = 1; j < arrTemp.length; j++) {
                    random 
    = (int) (Math.random() * 4);
                    
    switch (random) {
                    
    case 0:
                        sb.append(
    "+").append(arrTemp[j]);
                        arrTemp[j] 
    = arrTemp[j - 1+ arrTemp[j];
                        
    break;
                    
    case 1:
                        sb.append(
    "-").append(arrTemp[j]);
                        arrTemp[j] 
    = arrTemp[j - 1- arrTemp[j];
                        
    break;
                    
    case 2:
                        sb.append(
    "*").append(arrTemp[j]);
                        arrTemp[j] 
    = arrTemp[j - 1* arrTemp[j];
                        
    break;
                    
    case 3:
                        sb.append(
    "/").append(arrTemp[j]);
                        arrTemp[j] 
    = arrTemp[j - 1/ arrTemp[j];
                        
    break;

                    
    default:
                        
    break;
                    }
                }

                last 
    = arrTemp[arrTemp.length - 1];
                System.out.println(last);
                
    if (last == 2000) {
                    sb.append(
    "=2000");
                    results.add(sb.toString());
                }
            }

            
    for (Iterator<String> it = results.iterator(); it.hasNext();) {
                String item 
    = it.next();
                System.out.println(item);

            }
        }

        
    /**
         * 
    @param arrTemp
         * 
    @return void 打亂數組元素順序。
         
    */
        
    private static void shuffle(double[] arrTemp) {
            
    int index = 0;

            
    for (int i = 0; i < arrTemp.length; i++) {
                index 
    = (int) (Math.random() * arrTemp.length);
                swap(arrTemp, i, index);
            }
        }

        
    /**
         * 
    @param arrTemp
         * 
    @param i
         * 
    @param index
         *            交換數據元素
         
    */
        
    private static void swap(double[] arrTemp, int i, int index) {
            
    double temp = arrTemp[i];
            arrTemp[i] 
    = arrTemp[index];
            arrTemp[index] 
    = temp;
        }

    }
    有兩個技巧:在不確定是+-*/哪種情況下,可以random一下,多for幾次,那么這幾種情況大致上可以照顧到。
                          ()在算法里面的體現是,使用()我發現,數字的前后順序可以混亂。打印出結果不行的話再刪除不遲。
    打印結果:
    9.0*8.0-7.0*6.0+10.0*5.0=2000
    8.0*9.0-7.0*6.0+10.0*5.0=2000
    7.0*8.0+9.0*6.0+10.0*5.0=2000
    打印出來的效果不太好,我組織一下:
    5*(6*(-7+8*9)+10)=2000;
    5*(6*(7*8+9)+10)=2000;
    如果,不允許取負數的話,當然就只有一個結果了。

    有點疑惑,為什么Collection.shuffle()可以,Array.shuffle()卻不提供。

    當然,算法肯定有可以改進的地方。



    posted on 2011-03-29 12:31 wangflood 閱讀(367) 評論(1)  編輯  收藏

    Feedback

    # re: 56789+-*/() 2000 2011-03-30 13:12 wangflood
    趙靖 5:47:53 AM
    這題用逆波蘭(后綴)式再枚舉即可,然后轉化為帶括號的中綴式
    趙靖 5:48:17 AM
    就可以繞過括號,這樣就變成一道體力活了
    蕎葉 5:52:07 AM
    哈哈。
    蕎葉 5:52:49 AM
    那晚,我寫了三個小時。
    趙靖 5:53:27 AM
    完全做出來三個小時不算多,但是有正確的方向要堅定的多
    趙靖 5:54:51 AM
    數字是排定的,符號插入其中,再構造圖求路徑的話就更清晰了
    蕎葉 5:55:04 AM
    http://www.tkk7.com/wangflood/articles/Demo.html
    蕎葉 5:55:06 AM
    呵呵。
    趙靖 5:56:39 AM
    這樣做法可能是錯誤的,設想如果(5+6)*(7+8)+9+10這個順序是shuffle不出來的
    趙靖 5:57:21 AM
    后綴應為56+78+*9+10+
    趙靖 5:57:46 AM
    要去掉括號,后綴是一個絕佳的選擇
    蕎葉 5:58:01 AM
    不允許56這樣的組合。
    趙靖 5:58:13 AM
    我寫的是后綴式
    蕎葉 5:58:18 AM
    shuffle是把[5,6,7,8,9,10]的前后順序弄亂。
    蕎葉 5:58:27 AM
    發來看看啊。
    蕎葉 5:58:35 AM
    不懂后綴式是什么意思。、
    趙靖 5:58:52 AM
    逆波蘭式呀
    趙靖 5:59:08 AM
    就是后根遍歷表達式
    趙靖 6:01:35 AM
    看看你的程序能不能找到184
    蕎葉 6:02:03 AM
    為什么要找到184
    趙靖 6:02:20 AM
    這個說明你shuffle是不能表達括號的優先級的
    蕎葉 6:03:48 AM
    shuffle,比括號得到了更多的結果。
    蕎葉 6:03:59 AM
    但括號可以做到的,shuffle都給辦到。
    趙靖 6:04:31 AM
    你怎么表達這種括號呢(5+6)*(7+8)
    趙靖 6:04:52 AM
    shuffle 去掉括號看看
    蕎葉 6:05:22 AM
    對噢。
    蕎葉 6:06:35 AM
    可以這樣,5+6)*(7+8)
    算出5+6后,就是[11,7,8,9,10]再次shuffle
    趙靖 6:06:51 AM
    那算法也太猥瑣了些
    蕎葉 6:06:56 AM
    哈哈。就期望能算出第二個結果來。
    蕎葉 6:06:59 AM
    我也這么覺得啊。
    趙靖 6:09:47 AM
    這個式子的通用格式是

    5678910
    abcdef
    然后吧abcde查到合適的位置去,其中至少f是最后面的
    如56+67+*8+9+10+就表達了(5+6)*(7+8)+9+10
    趙靖 6:10:19 AM
    后綴計算是最快的,僅僅需要一個棧
      回復  更多評論
      


    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 啦啦啦www免费视频| 欧亚精品一区三区免费| 亚洲综合色区在线观看| 国产偷国产偷亚洲清高APP| 国产高清在线免费| 精品无码专区亚洲| 亚洲女人被黑人巨大进入| 一本一道dvd在线观看免费视频| 免费国产a国产片高清| jizz免费在线影视观看网站| 久久久久久亚洲精品不卡| eeuss影院免费92242部| 国产亚洲真人做受在线观看| 午夜免费福利片观看| 亚洲av无码久久忘忧草| 日本19禁啪啪无遮挡免费动图| 国产亚洲视频在线观看网址 | 亚洲а∨天堂久久精品9966| 国产精品美女午夜爽爽爽免费| 亚洲日韩AV无码一区二区三区人| 四虎永久在线免费观看| 中国好声音第二季免费播放| 亚洲五月激情综合图片区| 在线观看免费人成视频色9| AV激情亚洲男人的天堂国语| 亚洲综合色婷婷七月丁香| 亚洲视频免费在线看| WWW国产亚洲精品久久麻豆| 久久久久亚洲av成人无码电影| 一级毛片在线免费观看| 亚洲人成色4444在线观看| 国产亚洲精品国看不卡| 四虎在线最新永久免费| 麻豆一区二区三区蜜桃免费| 亚洲国产成人久久综合碰碰动漫3d| 国国内清清草原免费视频99| 一级毛片在播放免费| 亚洲不卡在线观看| 国产亚洲?V无码?V男人的天堂| 在线精品一卡乱码免费| 国产激情久久久久影院老熟女免费 |