|
16. What is the sum of the digits of the number 2^1000?
这个问题在帖子: 求2^1000的各位数字之和 里,已经讨论的很充分了。 不再详细讨论。
用递归with计算大数相乘,在http://www.itpub.net/viewthread. ... ;page=1#pid16957717里已经有了。
这里只贴出我的大数相乘的PLSQL,并把相应的幂和阶乘运算放到一个Package中。
这里用得到幂, 后面的题目会用到阶乘。
create or replace package body pkg_bignum is
function bigmulti(d1 varchar2, d2 varchar2) return varchar2 is
Result varchar2(4000) := '';
type t_numlist is table of number index by PLS_INTEGER;
numlist t_numlist;
i number;
j number;
lastm number;
tmp number;
begin
for i in 1 .. length(d1) + length(d2) loop
numlist(i) := 0;
end loop;
for i in 1 .. length(d1) loop
for j in 1 .. length(d2) loop
numlist(i + j - 1) := numlist(i + j - 1) +
substr(d1, -i, 1) * substr(d2, -j, 1);
end loop;
end loop;
lastm := 0;
for i in 1 .. 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;
return(ltrim(Result, '0'));
end;
function bigpower(d1 varchar2, n number) return varchar2 is
result varchar2(4000);
begin
result := '1';
for i in 1 .. n loop
result := bigmulti(result, d1);
end loop;
return result;
end;
function bigfact(d1 varchar2) return varchar2 is
result varchar2(4000);
begin
result := '1';
for i in 2 .. d1 loop
result := bigmulti(result, i);
end loop;
return result;
end;
end pkg_bignum;
测试,无论(2, 1000), (2^10, 100) 还是(2^100, 10)都很快。
SQL> with t as (select /*+ RESULT_CACHE */ pkg_bignum.bigpower(power(2, 100), 10) str from dual)
2 ,t1 as (select rownum n from T connect by rownum<= length(str))
3 select sum(substr(str,n,1)) from t, t1;
SUM(SUBSTR(STR,N,1))
--------------------
1366
Executed in 0.079 seconds
SQL> with t as (select /*+ RESULT_CACHE */ pkg_bignum.bigpower(power(2, 10), 100) str from dual)
2 ,t1 as (select rownum n from T connect by rownum<= length(str))
3 select sum(substr(str,n,1)) from t, t1;
SUM(SUBSTR(STR,N,1))
--------------------
1366
Executed in 0.031 seconds
SQL> with t as (select /*+ RESULT_CACHE */ pkg_bignum.bigpower( 2, 1000) str from dual)
2 ,t1 as (select rownum n from T connect by rownum<= length(str))
3 select sum(substr(str,n,1)) from t, t1;
SUM(SUBSTR(STR,N,1))
--------------------
1366
Executed in 0.016 seconds
SQL> |
|