|
本以为这个很容易, 没想到就这么往上加,加起来很快,不久就溢出了。
之前的大树package中一直没有大数和, 现在加上。(其实实现起来比乘法容易多了)
function bigplus(d1 varchar2, d2 varchar2) return varchar2 is
Result varchar2(30000) := '';
type t_numlist is table of number index by PLS_INTEGER;
numlist t_numlist;
i number;
lastm number;
tmp number;
begin
if d1<1e36 and d2<1e36 then
return d1+d2;
end if;
for i in 1 .. greatest(length(d1) ,length(d2)) loop
numlist(i) := nvl(substr(d1, -i, 1),0) + nvl(substr(d2, -i, 1),0);
end loop;
lastm := 0;
for i in 1 .. greatest(length(d1) ,length(d2)) loop
tmp := mod(numlist(i) + lastm, 10);
lastm := trunc((numlist(i) + lastm) / 10);
numlist(i) := tmp;
result := numlist(i) || result;
end loop;
if lastm>0 then result:=lastm||result; end if;
return(nvl(ltrim(Result, '0'),0));
end;
观察一下题目中数字的规律, 不难发现, 每对数的分母都是上对数的分子分母和, 而分子则是这个和再加上上一个分母。
然后, 简单的用个递归就行了。
with t(r, a, b)
as (select 1, '3', '2' from dual
union all
select
r+1,
pkg_bignum.bigplus(pkg_bignum.bigplus(a,b),b),
pkg_bignum.bigplus(a,b)
from t where r<1000)
select count(*) from t where length(a)>length(b)
/
COUNT(*)
----------
153
Executed in 1.781 seconds |
|