|
|
我那个新的交换思路你要不要试一下?
abc+def = ghi
acb+dfe = gih
在四位的情况下,我用递归 WITH 试过,因为要排除进位因素,不比我上一种方法更高效:
WITH n AS (
SELECT ROWNUM n FROM DUAL CONNECT BY ROWNUM<=12
)
,t (n1,n2,n3,n4,n5,n6,n7,n8,n9,n10,n11,n12,lvl) AS (
SELECT n,0,0,0,0,0,0,0,0,0,0,0,1
FROM n
WHERE n BETWEEN 1 AND 7
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
FROM t,n
WHERE n.n NOT IN (n1,n2,n3,n4,n5,n6,n7,n8,n9,n10,n11)
AND (t.lvl IN (3)
OR (t.lvl=11 AND n.n IN (MOD(t.n10+t.n11,16),MOD(t.n10+t.n11+1,16)) )
OR (t.lvl=10 AND n.n>t.n10)
OR (t.lvl=8 AND n.n IN (MOD(t.n7+t.n8,16),MOD(t.n7+t.n8+1,16)))
OR (t.lvl=7 AND n.n>t.n7)
OR (t.lvl=5 AND n.n IN (MOD(t.n4+t.n5,16),MOD(t.n4+t.n5+1,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)
OR (t.lvl=6 AND n.n>t.n4)
OR (t.lvl=9 AND n.n>t.n7)
)
)
,t2 AS (SELECT TO_CHAR(n1,'FMX') n1
,TO_CHAR(n2,'FMX') n2
,TO_CHAR(n3,'FMX') n3
,TO_CHAR(n4,'FMX') n4
,TO_CHAR(n5,'FMX') n5
,TO_CHAR(n6,'FMX') n6
,TO_CHAR(n7,'FMX') n7
,TO_CHAR(n8,'FMX') n8
,TO_CHAR(n9,'FMX') n9
,TO_CHAR(n10,'FMX') n10
,TO_CHAR(n11,'FMX') n11
,TO_CHAR(n12,'FMX') n12
FROM t
WHERE lvl=12
)
,t3 AS (
SELECT n1||n10||n7||n4 as x1
,n2||n11||n8||n5 as x2
,n3||n12||n9||n6 as x3
FROM t2
UNION ALL
SELECT n1||n10||n4||n7 as x1
,n2||n11||n5||n8 as x2
,n3||n12||n6||n9 as x3
FROM t2
UNION ALL
SELECT n1||n4||n10||n7 as x1
,n2||n5||n11||n8 as x2
,n3||n6||n12||n9 as x3
FROM t2
UNION ALL
SELECT n1||n4||n7||n10 as x1
,n2||n5||n8||n11 as x2
,n3||n6||n9||n12 as x3
FROM t2
UNION ALL
SELECT n1||n7||n4||n10 as x1
,n2||n8||n5||n11 as x2
,n3||n9||n6||n12 as x3
FROM t2
UNION ALL
SELECT n1||n7||n10||n4 as x1
,n2||n8||n11||n5 as x2
,n3||n9||n12||n6 as x3
FROM t2
)
SELECT COUNT(*) FROM T3 WHERE TO_NUMBER(x1,'XXXX') + TO_NUMBER(x2,'XXXX') = TO_NUMBER(x3,'XXXX');
[ 本帖最后由 newkid 于 2010-6-18 02:28 编辑 ] |
|