Decode360's Blog

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

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 ::  :: 管理 ::
            397 隨筆 :: 33 文章 :: 29 評論 :: 0 Trackbacks
          PLSQL算24點
          ?
          ?
          ??? 很早以前就想用PLSQL寫一個算24點的程序了,后來想了一下沒有研究下去,最近上ITPUB的時候正好大家都在討論,在大牛的基礎(chǔ)上修改了一下,基本上思想和算法都是沒有變的,就是學(xué)習(xí)了一下。還有兩個大問題沒有處理好,一是只用了枚舉法,用PLSQL應(yīng)該可以換個更好的遞歸算法的;二是沒有濾重;反正最后的結(jié)果只是最簡單的得到答案而已。
          ?
          ??? 具體的可以參見:
          ?
          ??? 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);
          ?
          posted on 2008-12-28 23:55 decode360 閱讀(156) 評論(0)  編輯  收藏 所屬分類: 06.PLSQL
          主站蜘蛛池模板: 龙岩市| 靖江市| 延川县| 信宜市| 邛崃市| 林口县| 建水县| 汽车| 灌南县| 古蔺县| 噶尔县| 沐川县| 璧山县| 保康县| 连州市| 新乡县| 武鸣县| 大庆市| 元朗区| 斗六市| 大冶市| 徐汇区| 芒康县| 深圳市| 六安市| 江达县| 潜江市| 太仓市| 永川市| 遵化市| 新兴县| 于田县| 莱州市| 乌什县| 柳林县| 东港市| 逊克县| 固阳县| 瑞安市| 尚志市| 吴桥县|