Decode360's Blog

          業(yè)精于勤而荒于嬉 QQ:150355677 MSN:decode360@hotmail.com

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 ::  :: 管理 ::
            302 隨筆 :: 26 文章 :: 82 評論 :: 0 Trackbacks
          <2008年12月>
          30123456
          78910111213
          14151617181920
          21222324252627
          28293031123
          45678910

          公告

          常用鏈接

          隨筆分類(299)

          隨筆檔案(299)

          文章分類(26)

          新聞分類(24)

          收藏夾(5)

          Blog列表

          IT網(wǎng)站

          My Link

          最新隨筆

          最新評論

          ??? 很早以前就想用PLSQL寫一個算24點的程序了,后來想了一下沒有研究下去,最近上ITPUB的時候正好大家都在討論,在大牛的基礎上修改了一下,基本上思想和算法都是沒有變的,就是學習了一下。還有兩個大問題沒有處理好,一是只用了枚舉法,用PLSQL應該可以換個更好的遞歸算法的;二是沒有濾重;反正最后的結果只是最簡單的得到答案而已。

          ?

          ??? 具體的可以參見:

          ??? http://www.itpub.net/viewthread.php?tid=1061129&extra=page%3D1%26amp%3Bfilter%3Ddigest&page=1

          ??? http://www.itpub.net/viewthread.php?tid=1077244&extra=&page=1

          ?

          ?

          ?

          create or replace function f_op (p_n1 number , p_op varchar2 , p_n2 number ) return number

          as

          begin

          ?? return case when p_op = '+' then p_n1 + p_n2

          ?????????????? when p_op = '-' then p_n1 - p_n2

          ?????????????? when p_op = '*' then p_n1 * p_n2

          ?????????????? when p_op = '/' and p_n2<> 0 then p_n1 / p_n2

          ?????????????? else null

          ????????? end ;

          end f_op;

          /

          ?

          ?

          ?

          create or replace procedure pro_24(p1 number , p2 number , p3 number , p4 number ) as

          ?

          r_result number default 0 ;

          ?

          begin

          ?

          ? for r in (

          ????? with t_num as

          ????????? ( select 1 id ,p1 as n from dual

          ?????????? union

          ?????????? select 2 id ,p2 as n from dual

          ?????????? union

          ?????????? select 3 id ,p3 as n from dual

          ?????????? union

          ?????????? select 4 id ,p4 as n from dual),

          ?????????? t_op as

          ????????? ( select '+' as o from dual

          ?????????? union

          ?????????? select '-' as o from dual

          ?????????? union

          ?????????? select '*' as o from dual

          ?????????? union

          ?????????? select '/' as o from dual)

          ?????? select distinct

          ????????????? a.n? as a,

          ????????????? o1.o as o1,

          ????????????? b.n? as b,

          ????????????? o2.o as o2,

          ????????????? c.n? as c,

          ????????????? o3.o as o3,

          ????????????? d.n? as d

          ???????? from t_num a, t_num b, t_num c, t_num d,

          ????????????? t_op? o1, t_op? o2, t_op? o3

          ??????? where a.id not in (b.id, c.id, d.id)

          ????????? and b.id not in (c.id, d.id)

          ????????? and c.id <> d.id) loop

          ?

          ?????? r_result := f_op(f_op(f_op(r.a,r.o1,r.b),r.o2,r.c),r.o3,r.d);

          ?????? if r_result between 23.9 and 24.1 then

          ?????? dbms_output.put_line( '((' ||r.a||r.o1||r.b|| ')' ||r.o2||r.c|| ')' ||r.o3||r.d);

          ?????? end if ; --((a b) c) d

          ??????

          ?????? r_result := f_op(f_op(r.a,r.o1,f_op(r.b,r.o2,r.c)),r.o3,r.d);

          ?????? if r_result between 23.9 and 24.1 then

          ?????? dbms_output.put_line( '(' ||r.a||r.o1|| '(' ||r.b||r.o2||r.c|| '))' ||r.o3||r.d);

          ?????? end if ; --(a (b c)) d

          ??????

          ?????? r_result := f_op(f_op(r.a,r.o1,r.b),r.o2,f_op(r.c,r.o3,r.d));

          ?????? if r_result between 23.9 and 24.1 then

          ?????? dbms_output.put_line( '(' ||r.a||r.o1||r.b|| ')' ||r.o2|| '(' ||r.c||r.o3||r.d|| ')' );

          ?????? end if ; --(a b) (c d)

          ??????

          ?????? r_result := f_op(r.a,r.o1,f_op(f_op(r.b,r.o2,r.c),r.o3,r.d));

          ?????? if r_result between 23.9 and 24.1 then

          ?????? dbms_output.put_line(r.a||r.o1|| '((' ||r.b||r.o2||r.c|| ')' ||r.o3||r.d|| ')' );

          ?????? end if ; --a ((b c) d)

          ???????????

          ?????? r_result := f_op(r.a,r.o1,f_op(r.b,r.o2,f_op(r.c,r.o3,r.d)));

          ?????? if r_result between 23.9 and 24.1 then

          ?????? dbms_output.put_line(r.a||r.o1|| '(' ||r.b||r.o2|| '(' ||r.c||r.o3||r.d|| '))' );

          ?????? end if ; --a (b (c d))

          ??????????

          ? end loop ;

          ?

          end ;

          ?

          /

          ?

          ?

          exec pro_24( 3 , 3 , 8 , 8 );





          -The End-

          posted on 2008-12-28 23:55 decode360-3 閱讀(233) 評論(0)  編輯  收藏 所屬分類: SQL Dev
          主站蜘蛛池模板: 上犹县| 仪陇县| 永吉县| 曲麻莱县| 桂林市| 东辽县| 宣汉县| 黄大仙区| 遂昌县| 义乌市| 腾冲县| 隆尧县| 宝清县| 亳州市| 邛崃市| 洪江市| 金华市| 辽宁省| 英山县| 亳州市| 东港市| 萨迦县| 桂林市| 温州市| 定襄县| 子洲县| 孝感市| 本溪| 沁阳市| 商洛市| 樟树市| 会泽县| 冀州市| 屯昌县| 汾阳市| 介休市| 池州市| 隆回县| 海南省| 汶川县| 阳春市|