|
看了一下问题贴中别人的写法,很多没看明白。
用excel观察了一下,才算找出规律:
比如对于17来说:
余数 商
1
10 0
15 5
14 8
4 8
6 2
9 3
5 5
16 2
7 9
2 4
3 1
13 1
11 7
8 6
12 4
1 7
10 0
15 5
14 8
4 8
6 2
9 3
5 5
16 2
7 9
在循环小数部分, 商的部分可能会有重复, 但余数不可能重复(余数只要重复,必然意味着后续序列重复)
btw: 由这个可以得到一个推论: 任何数的倒数的循环长度,都不可能超过这个数本身。
用这个思路, 就变的容易多了。
with tnum as (select rownum num from dual connect by rownum<=1000)
--with tnum as (select 7 num from dual )
, t(r, n,a, path, len) as (
select 0, num, 1, cast (',' as varchar2(4000)), 0 from tnum where mod(num,2)>0 and mod(num,5)>0
union all
select
r+1,
n,
mod(10*a,n),
case when r< least(20,n) then path else path||a||',' end, --假设非循环部分不超过20位, 为了怕遗漏也可以再加大, 越大性能越差。
case when substr(path, 2,instr(path, ',',2)-2) = a
then length(translate(path,',1234567890', ','))-1
else 0 end
from t where r<n+20 and len = 0)
, tresult as (select * from t where len>0 )
select n, len from tresult where len = (select max(len) from tresult)
N LEN
---------- ----------
983 982
Executed in 1.375 seconds
同样的思路,改成plsql会更快。就不贴了。
[ 本帖最后由 tree_new_bee 于 2010-12-19 13:51 编辑 ] |
|