楼主: 〇〇

[转载] 趣味题

[复制链接]
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
81#
 楼主| 发表于 2010-6-14 15:03 | 只看该作者
c语言版。貌似比plsql简单很多,cl -O2 pc4.c 17秒

  1. #include <stdio.h>
  2. #include <time.h>
  3. int main()
  4. {
  5. int i,j,k,r,t;
  6. char buf[13];
  7. char f[13];
  8. r=0;
  9. t=clock();
  10. for(i=0x1234;i<=0xcba9/2;i++)
  11. {
  12. if ((i%0x10==0)||(i/0x10%0x10==0)||(i/0x100%0x10==0)||(i%0x10==0xd)||(i/0x10%0x10==0xd)||(i/0x100%0x10==0xd)||(i%0x10==0xf)||(i/0x10%0x10==0xf)||(i/0x100%0x10==0xf)||(i%0x10==0xe)||(i/0x10%0x10==0xe)||(i/0x100%0x10==0xe))continue;
  13. for(j=i+1;j<=(0xcba9-i);j++)
  14. {
  15. if ((j%0x10==0)||(j/0x10%0x10==0)||(j/0x100%0x10==0)||(j%0x10==0xd)||(j/0x10%0x10==0xd)||(j/0x100%0x10==0xd)||(j%0x10==0xf)||(j/0x10%0x10==0xf)||(j/0x100%0x10==0xf)||(j%0x10==0xe)||(j/0x10%0x10==0xe)||(j/0x100%0x10==0xe))continue;
  16. k=i+j;
  17. if ((k%0x10==0)||(k/0x10%0x10==0)||(k/0x100%0x10==0)||(k%0x10==0xd)||(k/0x10%0x10==0xd)||(k/0x100%0x10==0xd)||(k%0x10==0xf)||(k/0x10%0x10==0xf)||(k/0x100%0x10==0xf)||(k%0x10==0xe)||(k/0x10%0x10==0xe)||(k/0x100%0x10==0xe))continue;
  18. sprintf(buf,"%x%x%x",i,j,i+j);
  19. for(k=1;k<=12;k++)f[k]=0;
  20. for(k=1;k<=12;k++)
  21. if(++f[(buf[k-1]-'0'>0 && buf[k-1]-'0'<=9)?buf[k-1]-'0':buf[k-1]-'a'+10]>1)goto a;
  22. r++;
  23. a:
  24. ;
  25. }
  26. }
  27. t=clock()-t;
  28. printf("%d,%d",r,t);
  29. return 1;
  30. }
复制代码

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int i,j,k,r;
  5. char buf[10];
  6. char f[10];
  7. r=0;
  8. for(i=123;i<=987;i++)
  9. {
  10. if ((i%10==0) || (i/10%10==0)||(i/100%10==0))continue;
  11. for(j=i+1;j<=(987-i);j++)
  12. {
  13. if ((j%10==0) || (j/10%10==0)||(j/100%10==0))continue;
  14. k=i+j;
  15. if ((k%10==0) || (k/10%10==0)||(k/100%10==0))continue;
  16. sprintf(buf,"%d%d%d",i,j,i+j);
  17. for(k=1;k<=9;k++)f[k]=0;
  18. for(k=1;k<=9;k++)
  19. if(++f[buf[k-1]-'0']>1)goto a;
  20. r++;
  21. a:
  22. ;
  23. }
  24. }
  25. printf("%d",r);
  26. return 1;
  27. }
复制代码

使用道具 举报

回复
论坛徽章:
1682
九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-27 15:37:10九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-19 11:12:55玉石琵琶
日期:2014-06-26 16:52:29玉石琵琶
日期:2014-06-26 16:52:29
82#
发表于 2010-6-14 18:13 | 只看该作者
oo很厉害。。

使用道具 举报

回复
论坛徽章:
520
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
83#
发表于 2010-6-14 21:51 | 只看该作者
原帖由 〇〇 于 2010-6-14 14:04 发表
怎么才能利用加数交换个十百位减少穷举次数呢

跟求组合的原理一样,先强行按升序或降序,然后对换。

使用道具 举报

回复
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
84#
 楼主| 发表于 2010-6-14 22:15 | 只看该作者

回复 #84 newkid 的帖子

怎么强行,
1.如果1234不行,只能1342才能拼出?
2.怎么记录已经成功的,下次跳过?

完全翻译plsql的c,6秒


  1. #include <stdio.h>
  2. #include <time.h>
  3. int main()
  4. {
  5. int i,j,k,r,t;
  6. char buf[13];
  7. char f[13];
  8. unsigned short I[12*11*90];
  9. unsigned short J[0xcbaa];
  10. r=0;
  11. t=clock();
  12. for(i=0x1234;i<=0xcba9;i++)
  13. {
  14. if ((i%0x10==0)||(i/0x10%0x10==0)||(i/0x100%0x10==0)||(i%0x10==0xd)||(i/0x10%0x10==0xd)||(i/0x100%0x10==0xd)||(i%0x10==0xf)||(i/0x10%0x10==0xf)||(i/0x100%0x10==0xf)||(i%0x10==0xe)||(i/0x10%0x10==0xe)||(i/0x100%0x10==0xe))
  15. J[i]=r;
  16. else
  17. {
  18. sprintf(buf,"%x",i);
  19. if (buf[0]!=buf[1] && buf[0]!=buf[2] && buf[0]!=buf[3] && buf[1]!=buf[2] && buf[1]!=buf[3] && buf[2]!=buf[3] )
  20. {
  21. I[r]=i;
  22. J[i]=r;
  23. r++;
  24. }
  25. else
  26. J[i]=r;
  27. }
  28. }
  29. r=0;
  30. for(i=0;i<J[0xcba9/2+1];i++)
  31. {
  32. for(j=J[I[i]+1];j<=J[0xcba9-I[i]];j++)
  33. {
  34. k=I[i]+I[j];
  35. if ((k%0x10==0)||(k/0x10%0x10==0)||(k/0x100%0x10==0)||(k%0x10==0xd)||(k/0x10%0x10==0xd)||(k/0x100%0x10==0xd)||(k%0x10==0xf)||(k/0x10%0x10==0xf)||(k/0x100%0x10==0xf)||(k%0x10==0xe)||(k/0x10%0x10==0xe)||(k/0x100%0x10==0xe))continue;
  36. sprintf(buf,"%x%x%x",I[i],I[j],k);
  37. for(k=1;k<=12;k++)f[k]=0;
  38. for(k=1;k<=12;k++)
  39. if(++f[(buf[k-1]-'0'>0 && buf[k-1]-'0'<=9)?buf[k-1]-'0':buf[k-1]-'a'+10]>1)goto a;
  40. r++;
  41. a:
  42. ;
  43. }
  44. }
  45. t=clock()-t;
  46. printf("%d,%d",r,t);
  47. return 1;
  48. }
复制代码

使用道具 举报

回复
论坛徽章:
520
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
85#
发表于 2010-6-14 22:27 | 只看该作者
比如我自己的写法,我在递归时强行指定顺序,输出时再对换:
WITH n AS (
   SELECT ROWNUM n FROM DUAL CONNECT BY ROWNUM<=9
   )
,t (n1,n2,n3,n4,n5,n6,n7,n8,n9,lvl) AS (
   SELECT n,0,0,0,0,0,0,0,0,1
     FROM n
    WHERE n<=4
   UNION ALL
   SELECT t.n1
         ,DECODE(t.lvl,1,n.n,t.n2)
         ,DECODE(t.lvl,2,n.n,t.n3)
         ,DECODE(t.lvl,3,n.n,t.n4)
         ,DECODE(t.lvl,4,n.n,t.n5)
         ,DECODE(t.lvl,5,n.n,t.n6)
         ,DECODE(t.lvl,6,n.n,t.n7)
         ,DECODE(t.lvl,7,n.n,t.n8)
         ,DECODE(t.lvl,8,n.n,t.n9)
         ,t.lvl+1
     FROM t,n
    WHERE n.n NOT IN (n1,n2,n3,n4,n5,n6,n7,n8)
          AND (t.lvl=1 AND n.n>t.n1 AND n.n+t.n1<=9
               OR (t.lvl=2 AND n.n - t.n1- t.n2 IN (0,1))
               OR (t.lvl=4 AND n.n > t.n4)
               OR (t.lvl=5 AND n.n = MOD(t.n4+ t.n5,10))
               OR (t.lvl=7 AND n.n > t.n7)
               OR t.lvl=8 AND n1*100+n7*10+n4 + n2*100+n8*10+n5 = n3*100+n.n*10+n6
               OR t.lvl IN (3,6)
              )
   )
,t2 AS (SELECT * FROM t WHERE lvl=9)
SELECT n1||n7||n4||' + '||n2||n8||n5||' = '||n3||n9||n6 FROM t2
UNION ALL
SELECT n1||n7||n5||' + '||n2||n8||n4||' = '||n3||n9||n6 FROM t2
UNION ALL
SELECT n1||n8||n4||' + '||n2||n7||n5||' = '||n3||n9||n6 FROM t2
UNION ALL
SELECT n1||n8||n5||' + '||n2||n7||n4||' = '||n3||n9||n6 FROM t2
;

使用道具 举报

回复
论坛徽章:
520
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
86#
发表于 2010-6-14 22:34 | 只看该作者
原来你是自己实现了SORT MERGE JOIN, 这个交换位数恐怕用不上了,因为没有什么可以快速跳过的办法。

[ 本帖最后由 newkid 于 2010-6-15 05:09 编辑 ]

使用道具 举报

回复
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
87#
 楼主| 发表于 2010-6-15 08:22 | 只看该作者

回复 #87 newkid 的帖子

来晚了,没有看到你的精彩解释
请教merge join的原理,我自己实现了都不知道...

4.8秒

  1. #include <stdio.h>
  2. #include <time.h>
  3. unsigned short m1(unsigned short i)
  4. {
  5.         unsigned short a=i/0x1000%0x10+1;
  6.         unsigned short b=i/0x100%0x10;
  7.         unsigned short c=i/0x10%0x10;
  8.         unsigned short d=i%0x10;
  9.         unsigned short t=a;
  10.         if(b==t)t=b+1;
  11.         if(c==t)t=c+1;
  12.         if(d==t)t=d+1;
  13.         return t*0x1000;
  14. }
  15. unsigned short m(unsigned short in)
  16. {
  17.         int i,j;
  18.         unsigned short t;
  19.         char buf[13]={0};
  20.         buf[in/0x1000%0x10]=1;
  21.         buf[in/0x100%0x10]=1;
  22.         buf[in/0x10%0x10]=1;
  23.         buf[in%0x10]=1;
  24.         t=0;//find highest digit
  25.         for(i=in/0x1000%0x10;i<=0xc;i++)
  26.         {
  27.                 if(buf[i]==0)
  28.                 {
  29.                         t=i;
  30.                         buf[i]=1;
  31.                         break;
  32.                 }
  33.         }
  34.         if(t==0)
  35.         return 0xcba9;
  36.         for(i=1,j=0;i<=0xc&&j<3;i++)//find other digit
  37.         if(buf[i]==0)
  38.         {t=(t<<4)+i;
  39.         j++;
  40.         }
  41.         return t;
  42. }
  43. int main()
  44. {
  45.        
  46. int i,j,k,r,t;
  47. char buf[13];
  48. char f[13];
  49. unsigned short I[12*11*90];
  50. unsigned short J[0xcbaa];
  51. r=0;
  52. /*
  53. printf("%x:%x\n",0x7234,m(0x7234));
  54. printf("%x:%x\n",0x7235,m(0x7235));
  55. printf("%x:%x\n",0x7238,m(0x7238));
  56. printf("%x:%x\n",0x523a,m(0x523a));
  57. printf("%x:%x\n",0x523b,m(0x523b));
  58. printf("%x:%x\n",0x523c,m(0x523c));
  59. return 1;
  60. */
  61. t=clock();
  62. for(i=0x1234;i<=0xcba9;i++)
  63. {
  64. if ((i%0x10==0)||(i/0x10%0x10==0)||(i/0x100%0x10==0)||(i%0x10==0xd)||(i/0x10%0x10==0xd)||(i/0x100%0x10==0xd)||(i%0x10==0xf)||(i/0x10%0x10==0xf)||(i/0x100%0x10==0xf)||(i%0x10==0xe)||(i/0x10%0x10==0xe)||(i/0x100%0x10==0xe))
  65. J[i]=r;
  66. else
  67. {
  68. sprintf(buf,"%x",i);
  69. if (buf[0]!=buf[1] && buf[0]!=buf[2] && buf[0]!=buf[3] && buf[1]!=buf[2] && buf[1]!=buf[3] && buf[2]!=buf[3] )
  70. {
  71. I[r]=i;
  72. J[i]=r;
  73. r++;
  74. }
  75. else
  76. J[i]=r;
  77. }
  78. }
  79. r=0;
  80. for(i=0;i<J[0xcba9/2+1];i++)
  81. {
  82. for(j=J[m(I[i])];j<=J[0xcba9-I[i]];j++)
  83. {
  84. k=I[i]+I[j];
  85. if ((k%0x10==0)||(k/0x10%0x10==0)||(k/0x100%0x10==0)||(k%0x10==0xd)||(k/0x10%0x10==0xd)||(k/0x100%0x10==0xd)||(k%0x10==0xf)||(k/0x10%0x10==0xf)||(k/0x100%0x10==0xf)||(k%0x10==0xe)||(k/0x10%0x10==0xe)||(k/0x100%0x10==0xe))continue;
  86. sprintf(buf,"%x%x%x",I[i],I[j],k);
  87. for(k=1;k<=12;k++)f[k]=0;
  88. for(k=1;k<=12;k++)
  89. if(++f[(buf[k-1]-'0'>0 && buf[k-1]-'0'<=9)?buf[k-1]-'0':buf[k-1]-'a'+10]>1)goto a;
  90. r++;
  91. a:
  92. ;
  93. }
  94. }
  95. t=clock()-t;
  96. printf("%d,%d",r,t);
  97. return 1;
  98. }
复制代码

使用道具 举报

回复
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
88#
 楼主| 发表于 2010-6-15 09:11 | 只看该作者

  1. SQL> set serverout on
  2. SQL> create or replace procedure pc7
  3.   2  as
  4.   3     time_before BINARY_INTEGER;
  5.   4     time_after BINARY_INTEGER;
  6.   5     TYPE t_num IS TABLE OF PLS_INTEGER INDEX BY  PLS_INTEGER ;
  7.   6     x t_num;
  8.   7     --a t_num;
  9.   8     b t_num;
  10.   9     c PLS_INTEGER;
  11. 10     c1 PLS_INTEGER;
  12. 11     r PLS_INTEGER;
  13. 12     t PLS_INTEGER;
  14. 13     t1 PLS_INTEGER;
  15. 14     l varchar(4);
  16. 15  begin
  17. 16  c:=0;
  18. 17  time_before := DBMS_UTILITY.GET_TIME;
  19. 18  for i in to_number('1234','fm0xxx')..to_number('cba9','fm0xxx') loop
  20. 19  l:=to_char(i,'fm0xxx');
  21. 20  if substr(l,1,1)<>substr(l,2,1)and
  22. 21  substr(l,2,1)<>substr(l,3,1)and
  23. 22  substr(l,3,1)<>substr(l,4,1)and
  24. 23  substr(l,1,1)<>substr(l,3,1)and
  25. 24  substr(l,2,1)<>substr(l,4,1)and
  26. 25  substr(l,1,1)<>substr(l,4,1)and
  27. 26  instr(l,0)=0 and instr(l,'d')=0 and instr(l,'e')=0 and instr(l,'f')=0 then
  28. 27  c:=c+1;
  29. 28  --if i<to_number('cba9','fm0xxx')/2 then
  30. 29  --a(c):=i;
  31. 30  --c1:=c;
  32. 31  --end if;
  33. 32  b(c):=i;
  34. 33  x(i):=c;
  35. 34  else
  36. 35  x(i):=c;
  37. 36  end if;
  38. 37  end loop;
  39. 38  r:=0;
  40. 39  --dbms_output.put_line('c='||c||'c1='||c1||a(1)||b(1));
  41. 40  FOR I IN 1 .. x(to_number('cba9','fm0xxx')/2) LOOP
  42. 41  t:=mod(trunc(b(i)/4096),16)+1;
  43. 42  t1:=mod(trunc(b(i)/256),16);
  44. 43  if t1=t then
  45. 44   t:=t1+1;
  46. 45  end if;
  47. 46  t1:=mod(trunc(b(i)/16),16);
  48. 47  if t1=t then
  49. 48   t:=t1+1;
  50. 49  end if;
  51. 50  t1:=mod(b(i),16);
  52. 51  if t1=t then
  53. 52   t:=t1+1;
  54. 53  end if;
  55. 54  t:=t*4096;
  56. 55  FOR J IN x(t) .. x(to_number('cba9','fm0xxx')-b(i)) LOOP
  57. 56  --if translate('123456789abc','$'||to_char(b(i),'fm0xxx')||to_char(b(j),'fm0xxx')||to_char(b(i)+b(j),'fm0xxx'),'$')is null then
  58. 57  --dbms_output.put_line(to_char(b(i),'fm0xxx')||to_char(b(j),'fm0xxx')||to_char(b(i)+b(j),'fm0xxx'));
  59. 58  --NULL;
  60. 59  l:=to_char(b(i)+b(j),'fm0xxx');
  61. 60  if substr(l,1,1)<>substr(l,2,1)and
  62. 61  substr(l,2,1)<>substr(l,3,1)and
  63. 62  substr(l,3,1)<>substr(l,4,1)and
  64. 63  substr(l,1,1)<>substr(l,3,1)and
  65. 64  substr(l,2,1)<>substr(l,4,1)and
  66. 65  substr(l,1,1)<>substr(l,4,1)and
  67. 66  instr(l,0)=0 and instr(l,'d')=0 and instr(l,'e')=0 and instr(l,'f')=0
  68. 67  --length(translate('0def','$'||l,'$'))=4
  69. 68  and length(translate(to_char(b(i),'fm0xxx'),'$'||l,'$'))=4
  70. 69  and length(translate(to_char(b(j),'fm0xxx'),'$'||l,'$'))=4
  71. 70  and length(translate(to_char(b(i),'fm0xxx'),'$'||to_char(b(j),'fm0xxx'),'$'))=4 then
  72. 71  r:=r+1;
  73. 72  --dbms_output.put_line(to_char(b(i),'fm0xxx')||to_char(b(j),'fm0xxx')||to_char(b(i)+b(j),'fm0xxx'));
  74. 73  end if;
  75. 74  end loop;
  76. 75  --if r>=100 then
  77. 76    --exit;
  78. 77  --end if;
  79. 78  end loop;
  80. 79
  81. 80  time_after := DBMS_UTILITY.GET_TIME;
  82. 81  DBMS_OUTPUT.PUT_LINE ('output:'||(time_after - time_before)||'rows:'||r);
  83. 82  end;
  84. 83  /

  85. 过程已创建。

  86. 已用时间:  00: 00: 00.06
  87. SQL> exec pc7;
  88. output:9029rows:3408

  89. PL/SQL 过程已成功完成。

  90. 已用时间:  00: 01: 30.30
复制代码

使用道具 举报

回复
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
89#
 楼主| 发表于 2010-6-15 12:34 | 只看该作者
已用时间:  00: 00: 00.06
SQL> exec pc7;
output:9029rows:3408

PL/SQL 过程已成功完成。

已用时间:  00: 01: 30.30
SQL> alter procedure pc7 compile plsql_code_type=native;

过程已更改。

已用时间:  00: 00: 00.10
SQL> exec pc7;
output:8316rows:3408

PL/SQL 过程已成功完成。

已用时间:  00: 01: 23.16

使用道具 举报

回复
论坛徽章:
520
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
90#
发表于 2010-6-15 22:03 | 只看该作者
sort merge join:
http://asktom.oracle.com/pls/ask ... ON_ID:3109440977616
你的连接条件仅有a.n<b.n,所以和他描述的不太一样。

我稍微改写了一下,奇怪的是答案比你多了很多:
WITH n AS (
   SELECT ROWNUM n FROM DUAL CONNECT BY ROWNUM<=15
   )
,t (n1,n2,n3,n4,n5,n6,n7,n8,n9,n10,n11,n12,lvl,roundup) AS (
   SELECT n,0,0,0,0,0,0,0,0,0,0,0,1,0
     FROM n
    WHERE n<8
   UNION ALL
   SELECT t.n1
         ,DECODE(t.lvl,1 ,n.n,t.n2 )
         ,DECODE(t.lvl,2 ,n.n,t.n3 )
         ,DECODE(t.lvl,3 ,n.n,t.n4 )
         ,DECODE(t.lvl,4 ,n.n,t.n5 )
         ,DECODE(t.lvl,5 ,n.n,t.n6 )
         ,DECODE(t.lvl,6 ,n.n,t.n7 )
         ,DECODE(t.lvl,7 ,n.n,t.n8 )
         ,DECODE(t.lvl,8 ,n.n,t.n9 )
         ,DECODE(t.lvl,9 ,n.n,t.n10)
         ,DECODE(t.lvl,10,n.n,t.n11)
         ,DECODE(t.lvl,11,n.n,t.n12)
         ,t.lvl+1
         ,CASE t.lvl
          WHEN 5  THEN FLOOR((t.n4 +t.n5 )/16)
          WHEN 8  THEN FLOOR((t.n7 +t.n8 +t.roundup)/16)
          WHEN 11 THEN FLOOR((t.n10+t.n11+t.roundup)/16)
          ELSE t.roundup
          END
     FROM t,n
    WHERE n.n NOT IN (n1,n2,n3,n4,n5,n6,n7,n8,n9,n10,n11)
          AND (t.lvl IN (3,6,9)
               OR (t.lvl=11 AND n.n = MOD(t.n10+t.n11+t.roundup,16) AND t.n3=t.n1+t.n2+FLOOR((t.n10+t.n11)/16))
               OR (t.lvl=10 AND n.n>t.n10)
               OR (t.lvl=8 AND n.n = MOD(t.n7+t.n8+t.roundup,16))
               OR (t.lvl=7 AND n.n>t.n7)
               OR (t.lvl=5 AND n.n = MOD(t.n4+ t.n5,16))
               OR (t.lvl=4 AND n.n>t.n4)
               OR (t.lvl=2 AND n.n - t.n1- t.n2 IN (0,1))
               OR (t.lvl=1 AND n.n>t.n1 AND n.n+t.n1<=15)
              )
   )
SELECT TO_CHAR(n1,'X')  ||TO_CHAR(n10,'X')||TO_CHAR(n7,'X')||TO_CHAR(n4,'X')
       ||' + '                          
       ||TO_CHAR(n2,'X')||TO_CHAR(n11,'X')||TO_CHAR(n8,'X')||TO_CHAR(n5,'X')
       ||' = '                          
       ||TO_CHAR(n3,'X')||TO_CHAR(n12,'X')||TO_CHAR(n9,'X')||TO_CHAR(n6,'X')  ------ 位数对调的其他组合略
  FROM t
WHERE lvl=12
      ;

位置的排列组合还可以更彻底,个、十、百还可以对调。

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表