楼主: tree_new_bee

Euler Project 挨个做 - 之一(Q1-50)

[复制链接]
论坛徽章:
10
CTO参与奖
日期:2009-02-20 09:44:20ITPUB年度最佳技术原创精华奖
日期:2013-03-22 13:18:30迷宫蛋
日期:2012-05-07 10:55:58茶鸡蛋
日期:2012-04-19 16:08:262012新春纪念徽章
日期:2012-01-04 11:54:462011新春纪念徽章
日期:2011-01-04 10:24:02数据库板块每日发贴之星
日期:2010-12-19 01:01:02数据库板块每日发贴之星
日期:2010-12-13 01:01:012009日食纪念
日期:2009-07-22 09:30:00优秀写手
日期:2014-02-08 06:00:12
231#
 楼主| 发表于 2010-12-27 21:18 | 只看该作者
另一个方法, 是根据p(n)=n(3n-1)/2来求得:  p(n) + p(m) 和p(n)-p(m)
设d=n-m, 则:
p(n) + p(n-d) = n(3n-1)/2 +(n-d)(3*(n-d) - 1)/2 = 3*n^2 +1.5*d^2 -3nd -n + 0.5d
p(n) - p(n-d) =  n(3n-1)/2 - (n-d)(3*(n-d) - 1)/2 = 3nd - 1.5d^2 - 0.5d

上面两个结果要为整数,则d必须为奇数。


with tn as (select rownum n from dual connect by rownum<=3000)
,td as (select rownum*2-1 d from dual connect by rownum<=(3000+1)/2)
select n*(3*n-1)/2 pen2, (n-d)*(3*(n-d)-1)/2 pen1, n*(3*n-1)/2-(n-d)*(3*(n-d)-1)/2 PD
from tn, td
where d<n
and floor((sqrt(24*( 3*n*n + 1.5*d*d -3*n*d -n + 0.5*d   )+1)+1)/6)
=   (sqrt(24*(3*n*n + 1.5*d*d -3*n*d -n + 0.5*d)+1)+1)/6
and floor((sqrt(24*( 3*n*d -1.5*d*d -0.5*d )+1)+1)/6)
=   (sqrt(24*(3*n*d -1.5*d*d -0.5*d)+1)+1)/6

      PEN2       PEN1         PD
---------- ---------- ----------
   7042750    1560090    5482660

Executed in 17.703 seconds

时间差不多。 其实也正常, 只是公式有差别,但实质是相同的。

使用道具 举报

回复
论坛徽章:
10
CTO参与奖
日期:2009-02-20 09:44:20ITPUB年度最佳技术原创精华奖
日期:2013-03-22 13:18:30迷宫蛋
日期:2012-05-07 10:55:58茶鸡蛋
日期:2012-04-19 16:08:262012新春纪念徽章
日期:2012-01-04 11:54:462011新春纪念徽章
日期:2011-01-04 10:24:02数据库板块每日发贴之星
日期:2010-12-19 01:01:02数据库板块每日发贴之星
日期:2010-12-13 01:01:012009日食纪念
日期:2009-07-22 09:30:00优秀写手
日期:2014-02-08 06:00:12
232#
 楼主| 发表于 2010-12-27 21:20 | 只看该作者
把d必须为奇数的条件加到#230的语句中, 效果倒是挺明显的:

with tpen as (select rownum n, rownum*(rownum*3-1)/2 pen from dual connect by rownum<=3000)
select t1.n n1, t1.pen pen1, t2.n n2, t2.pen pen2, t2.pen-t1.pen d  from tpen t1, tpen t2
where floor((sqrt(24*(t1.pen+t2.pen)+1)+1)/6) =   (sqrt(24*(t1.pen+t2.pen)+1)+1)/6
and floor((sqrt(24*(t2.pen-t1.pen)+1)+1)/6) =   (sqrt(24*(t2.pen-t1.pen)+1)+1)/6
and t1.pen < t2.pen
and mod(t2.n - t1.n,2) = 1

        N1       PEN1         N2       PEN2          D
---------- ---------- ---------- ---------- ----------
      1020    1560090       2167    7042750    5482660

Executed in 12.015 seconds

使用道具 举报

回复
论坛徽章:
10
CTO参与奖
日期:2009-02-20 09:44:20ITPUB年度最佳技术原创精华奖
日期:2013-03-22 13:18:30迷宫蛋
日期:2012-05-07 10:55:58茶鸡蛋
日期:2012-04-19 16:08:262012新春纪念徽章
日期:2012-01-04 11:54:462011新春纪念徽章
日期:2011-01-04 10:24:02数据库板块每日发贴之星
日期:2010-12-19 01:01:02数据库板块每日发贴之星
日期:2010-12-13 01:01:012009日食纪念
日期:2009-07-22 09:30:00优秀写手
日期:2014-02-08 06:00:12
233#
 楼主| 发表于 2010-12-28 00:08 | 只看该作者
用plsql写了一段比较严密的解决方案, 用于确认找到的D就是最小的D:

create or replace procedure tempproc is
  i integer;
  j integer;
  k integer;
  D number :=1E30;
  kmj number;
  kpj number;
  function pent(n number) return number is
  begin
    return n*(3*n-1)/2;
  end;
  function ispent(x number) return boolean is
  begin
    return (floor((sqrt(24*x+1) + 1)/6) = (sqrt(24*x+1) + 1)/6 ) ;
  end;
begin
  k:=2;
  j:=1;
  while k  < (D-1)/3+1 loop -- pent(k)-pent(k-1)<D
     j:=k-1;
     while j>0 loop
         PRAGMA INLINE (pent, 'YES');
         kmj := pent(k)-pent(j);
         if kmj > D then exit; end if;

         PRAGMA INLINE (pent, 'YES');
         kpj := pent(k)+pent(j);

         PRAGMA INLINE (ispent, 'YES');
         if ispent(kmj) and ispent(kpj) then
           if kmj< D then D:=kmj; end if;
         end if;
         j:=j-2;
     end loop;   
     k:=k+1;
  end loop;
  dbms_output.put_line('the D is: '||D );
  dbms_output.put_line('the last k tested is:' || k );
  
end tempproc;

SQL> exec tempproc

the D is: 5482660
the last k tested is:1827554

PL/SQL procedure successfully completed

Executed in 27.531 seconds


严密的代价是plsql代码要跑27秒。

在该题目的帖子中, 似乎很少人提起这一点。 不知是所有人都忽略了, 还是说有什么方法能证明找到的第一个D就一定是最小的D?


如果,不加这个严密判断, 在找到第一个D时就退出, 这段代码只要运行3秒

[ 本帖最后由 tree_new_bee 于 2010-12-28 00:19 编辑 ]

使用道具 举报

回复
论坛徽章:
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
234#
发表于 2010-12-28 06:25 | 只看该作者
原帖由 tree_new_bee 于 2010-12-27 14:48 发表


一直没找到MATERIALIZE hint的相关说明。 看字面含义似乎与result_cache差不多?


MATERIALIZE 是指把子查询结果当作临时表来访问,不再和外层查询结合进行变形,result_cache则是在第二次运行SQL的时候直接取结果。

使用道具 举报

回复
论坛徽章:
10
CTO参与奖
日期:2009-02-20 09:44:20ITPUB年度最佳技术原创精华奖
日期:2013-03-22 13:18:30迷宫蛋
日期:2012-05-07 10:55:58茶鸡蛋
日期:2012-04-19 16:08:262012新春纪念徽章
日期:2012-01-04 11:54:462011新春纪念徽章
日期:2011-01-04 10:24:02数据库板块每日发贴之星
日期:2010-12-19 01:01:02数据库板块每日发贴之星
日期:2010-12-13 01:01:012009日食纪念
日期:2009-07-22 09:30:00优秀写手
日期:2014-02-08 06:00:12
235#
 楼主| 发表于 2010-12-28 09:16 | 只看该作者
原帖由 newkid 于 2010-12-28 06:25 发表


MATERIALIZE 是指把子查询结果当作临时表来访问,不再和外层查询结合进行变形,result_cache则是在第二次运行SQL的时候直接取结果。


谢谢, 明白了。

使用道具 举报

回复
论坛徽章:
10
CTO参与奖
日期:2009-02-20 09:44:20ITPUB年度最佳技术原创精华奖
日期:2013-03-22 13:18:30迷宫蛋
日期:2012-05-07 10:55:58茶鸡蛋
日期:2012-04-19 16:08:262012新春纪念徽章
日期:2012-01-04 11:54:462011新春纪念徽章
日期:2011-01-04 10:24:02数据库板块每日发贴之星
日期:2010-12-19 01:01:02数据库板块每日发贴之星
日期:2010-12-13 01:01:012009日食纪念
日期:2009-07-22 09:30:00优秀写手
日期:2014-02-08 06:00:12
236#
 楼主| 发表于 2010-12-28 09:28 | 只看该作者
Q45  After 40755, what is the next triangle number that is also pentagonal and hexagonal?

Triangle, pentagonal, and hexagonal numbers are generated by the following formulae:
Triangle                   T_(n)=n(n+1)/2                   1, 3, 6, 10, 15, ...
Pentagonal                   P_(n)=n(3n−1)/2                   1, 5, 12, 22, 35, ...
Hexagonal                   H_(n)=n(2n−1)                   1, 6, 15, 28, 45, ...

It can be verified that T_(285) = P_(165) = H_(143) = 40755.

Find the next triangle number that is also pentagonal and hexagonal.

使用道具 举报

回复
论坛徽章:
10
CTO参与奖
日期:2009-02-20 09:44:20ITPUB年度最佳技术原创精华奖
日期:2013-03-22 13:18:30迷宫蛋
日期:2012-05-07 10:55:58茶鸡蛋
日期:2012-04-19 16:08:262012新春纪念徽章
日期:2012-01-04 11:54:462011新春纪念徽章
日期:2011-01-04 10:24:02数据库板块每日发贴之星
日期:2010-12-19 01:01:02数据库板块每日发贴之星
日期:2010-12-13 01:01:012009日食纪念
日期:2009-07-22 09:30:00优秀写手
日期:2014-02-08 06:00:12
237#
 楼主| 发表于 2010-12-28 09:40 | 只看该作者
做完44,再看45题太容易了。
注意一点: 六角数必然是三角数, 所以没有必要判断三角数。

为了避免猜测上限, 可以用connect by 或者递归with.

select max(rownum+144),
max(rownum+144)*(2*max(rownum+144)-1)
from dual --where CONNECT_BY_ISLEAF=1
connect by trunc((sqrt(24* (rownum+143)*(2*(rownum+143)-1)+1) + 1)/6 ) <>   (sqrt(24* (rownum+143)*(2*(rownum+143)-1)+1) + 1)/6

MAX(ROWNUM+144) MAX(ROWNUM+144)*(2*MAX(ROWNUM+
--------------- ------------------------------
          27693                     1533776805

Executed in 0.188 seconds



直接pass!

使用道具 举报

回复
论坛徽章:
11
2010新春纪念徽章
日期:2010-03-01 11:08:27SQL大赛参与纪念
日期:2011-04-13 12:08:172010广州亚运会纪念徽章:空手道
日期:2011-03-08 15:29:592011新春纪念徽章
日期:2011-02-18 11:43:362010广州亚运会纪念徽章:台球
日期:2011-01-26 10:41:28数据库板块每日发贴之星
日期:2010-12-10 01:01:022010广州亚运会纪念徽章:网球
日期:2010-12-09 13:11:342010广州亚运会纪念徽章:篮球
日期:2010-12-06 14:28:04辩论纪念章
日期:2010-11-15 10:46:13ITPUB9周年纪念徽章
日期:2010-10-08 09:28:52
238#
发表于 2010-12-28 11:05 | 只看该作者
俺懒自己不想做,每天来看看楼主解题,果然NB啊...楼主辛苦了

使用道具 举报

回复
论坛徽章:
10
CTO参与奖
日期:2009-02-20 09:44:20ITPUB年度最佳技术原创精华奖
日期:2013-03-22 13:18:30迷宫蛋
日期:2012-05-07 10:55:58茶鸡蛋
日期:2012-04-19 16:08:262012新春纪念徽章
日期:2012-01-04 11:54:462011新春纪念徽章
日期:2011-01-04 10:24:02数据库板块每日发贴之星
日期:2010-12-19 01:01:02数据库板块每日发贴之星
日期:2010-12-13 01:01:012009日食纪念
日期:2009-07-22 09:30:00优秀写手
日期:2014-02-08 06:00:12
239#
 楼主| 发表于 2010-12-28 11:15 | 只看该作者
原帖由 6666444 于 2010-12-28 11:05 发表
俺懒自己不想做,每天来看看楼主解题,果然NB啊...楼主辛苦了


看别人做100道,不如自己做1道。

使用道具 举报

回复
论坛徽章:
10
CTO参与奖
日期:2009-02-20 09:44:20ITPUB年度最佳技术原创精华奖
日期:2013-03-22 13:18:30迷宫蛋
日期:2012-05-07 10:55:58茶鸡蛋
日期:2012-04-19 16:08:262012新春纪念徽章
日期:2012-01-04 11:54:462011新春纪念徽章
日期:2011-01-04 10:24:02数据库板块每日发贴之星
日期:2010-12-19 01:01:02数据库板块每日发贴之星
日期:2010-12-13 01:01:012009日食纪念
日期:2009-07-22 09:30:00优秀写手
日期:2014-02-08 06:00:12
240#
 楼主| 发表于 2010-12-28 11:18 | 只看该作者
Q46 What is the smallest odd composite that cannot be written as the sum of a prime and twice a square?

It was proposed by Christian Goldbach that every odd composite number can be written as the sum of a prime and twice a square.

9 = 7 + 2×1^(2)
15 = 7 + 2×2^(2)
21 = 3 + 2×3^(2)
25 = 7 + 2×3^(2)
27 = 19 + 2×2^(2)
33 = 31 + 2×1^(2)

It turns out that the conjecture was false.

What is the smallest odd composite that cannot be written as the sum of a prime and twice a square?

[ 本帖最后由 tree_new_bee 于 2010-12-28 14:41 编辑 ]

使用道具 举报

回复

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

本版积分规则 发表回复

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