楼主: 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
261#
 楼主| 发表于 2010-12-29 13:15 | 只看该作者
这个题,看似麻烦, 做起来很轻松:

with t as (select column_value p from table(pkg_prim2.seive_numlist(9999)) where column_value>1000)
select t1.p, t2.p, t3.p, t1.p||t2.p||t3.p  from t t1, t t2, t t3
where t1.p < t2.p  and t2.p<t3.p
and  translate('0123456789', t1.p||'0123456789', t1.p)= translate('0123456789', t2.p||'0123456789', t2.p)
and  translate('0123456789', t1.p||'0123456789', t1.p)= translate('0123456789', t3.p||'0123456789', t3.p)
and t3.p-t2.p = t2.p - t1.p
and t1.p <> 1487



         P          P          P T1.P||T2.P||T3.P
---------- ---------- ---------- --------------------------------------------------------------------------------
      2969       6299       9629 296962999629

Executed in 0.125 seconds

注意,其中的translate条件并不严密, 在4位数字中有重复数字时,会有漏网之鱼, 比如:会把1009与1019当作是互为排列。
我本来是打算加上其它条件等结果出来后,再修改条件的。
不过,加上其它条件后,只有上面的一条结果, 自然就无须再费神了。

这里,对translate的用法, 与http://www.itpub.net/thread-1382582-1-2.html 帖子中的用法相似。

使用道具 举报

回复
论坛徽章:
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
262#
 楼主| 发表于 2010-12-29 13:59 | 只看该作者
Q50 Which prime, below one-million, can be written as the sum of the most consecutive primes?

The prime 41, can be written as the sum of six consecutive primes:
41 = 2 + 3 + 5 + 7 + 11 + 13

This is the longest sum of consecutive primes that adds to a prime below one-hundred.

The longest sum of consecutive primes below one-thousand that adds to a prime, contains 21 terms, and is equal to 953.

Which prime, below one-million, can be written as the sum of the most consecutive primes?

使用道具 举报

回复
论坛徽章:
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
263#
 楼主| 发表于 2010-12-29 14:33 | 只看该作者
这个题, 初看非常难。
要把每个数去分解成一系列质数的加法, 分解的方法太多了, 简直是个天文数字。看上去就似乎不可行。

所以,可以反过来:
从第一个质数开始,往后面累加。 累加到1000000以内的最大值。  如果这个累加数不是质数, 则考虑从最小的质数开始从中减去, 直到能得到一个质数为止。


用这样的方法, 人肉+程序辅助, 其实很快就能找到答案:

列出从2开始的质数, 及累加和:
with t as (select   column_value p from table(pkg_prim2.seive_numlist(4871)) )
,ts as (select   row_number() over (order by p) r, p, sum(p) over (order by p) s from t)
select * from ts

         R          P          S
---------- ---------- ----------
         1          2          2
         2          3          5
         3          5         10
         4          7         17
.....
       544       3923     989801
       545       3929     993730
       546       3931     997661
       547       3943    1001604

1001604要想减到100万以内,需要减很多小质数, 所以先不考虑。
997661如果是质数就好了, 那么它一定是那个最长的数!
可惜它不是, 从997661里分别减2,(2+3), (2+3+5)后, 发现997661-10=997651是个质数。  只减掉3个小质数就出现了, 而再小一点的几个数没有这么幸运。993730需要减掉(2-13), 989801需要减掉(2-17).
因此997651这个数的可能性非常大!

使用道具 举报

回复
论坛徽章:
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
264#
 楼主| 发表于 2010-12-29 14:35 | 只看该作者
把上面的思路, 用SQL完整的描述出来:

with t as (select   column_value p from table(pkg_prim2.seive_numlist(5000)) )
,ts as (select   row_number() over (order by p) r, p, sum(p) over (order by p) s from t)
--select * from ts
,t1 as (select t1.r r1, t2.r r2, t1.p p1, t2.p p2, t1.s s1, t2.s s2, t1.r-t2.r rcnt, t1.s-t2.s thenumber from ts t1, (select * from ts union all select 0,0,0 from dual) t2
where t1.r - t2.r > 21 and t1.s-t2.s<=1000000
and pkg_prim2.isprim(t1.s-t2.s)=0)
select * from t1 where rcnt = (select max(rcnt) from t1)

        R1         R2         P1         P2         S1         S2       RCNT  THENUMBER
---------- ---------- ---------- ---------- ---------- ---------- ---------- ----------
       546          3       3931          5     997661         10        543     997651

Executed in 6.219 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
265#
 楼主| 发表于 2010-12-29 14:41 | 只看该作者
相应newkid的号召, 另开新楼:

http://www.itpub.net/thread-1383369-1-1.html

使用道具 举报

回复
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
266#
发表于 2010-12-29 14:45 | 只看该作者
ZT50
题目简介:素数41能写成连续6个素数之和:
    41 = 2 + 3 + 5 + 7 + 11 + 13
  现在要求1,000,000以内的素数,能表示为最多的连续素数之和的那个数。
题目分析:我这儿采取的是类似“迭代加深搜索”的算法:首先对“连续素数”的个数做一个上界估计,记为
len。然后看1000000以内有没有len个连续素数其和也为素数,并且在1000000以内。如果有,这这个和就是
解;否则,将len减1,继续上述操作。
答  案:997651

使用道具 举报

回复
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
267#
发表于 2010-12-29 14:46 | 只看该作者
这个“连续”简化了问题

使用道具 举报

回复
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
268#
发表于 2010-12-29 15:08 | 只看该作者
50的sql版
var n number;
exec :n:=25000000
with ta as
(select level*2+1 l from dual connect by level<=sqrt(:N)/2),
t1 as (select level*2+1 l from dual connect by level<=sqrt(:N)/3)
,p1k as(select l rn from ta --1000以内的质数
minus
select /*+ USE_MERGE (t1 t2) */ t1.l*t2.l from t1,t1 t2 where t1.l<=sqrt(sqrt(:N))
and t1.l<=t2.l and t1.l*t2.l<=:N
)
,test as
(select rn, sum(rn) over(order by rn)s from p1k)
,t2 as(select max(s)s1,max(rn)rn1 from test where s<1E6)
select max(s1-test.s)from test,t2
where not exists(select 1 from p1k where p1k.rn <=sqrt(s1)and mod(s1-test.s,p1k.rn)=0);

MAX(S1-TEST.S)
--------------
        997651

已用时间:  00: 00: 00.19

使用道具 举报

回复
论坛徽章:
3
ITPUB9周年纪念徽章
日期:2010-10-08 09:34:032011新春纪念徽章
日期:2011-02-18 11:43:34ITPUB十周年纪念徽章
日期:2011-11-01 16:25:51
269#
发表于 2010-12-30 16:18 | 只看该作者

回复 #4 tree_new_bee 的帖子

数据库什么版本的?
我10G这提示不支持列别名

使用道具 举报

回复
论坛徽章:
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
270#
 楼主| 发表于 2010-12-30 17:14 | 只看该作者
原帖由 yizhong010 于 2010-12-30 16:18 发表
数据库什么版本的?
我10G这提示不支持列别名


帖中所有的递归with语句 (即with 后面的表名后面带有括号的), 都需要11.2以上版本。

使用道具 举报

回复

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

本版积分规则 发表回复

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