楼主: newkid

[精华] puzzleup2012谜题,请用SQL或PLSQL解答

[复制链接]
论坛徽章:
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
231#
 楼主| 发表于 2012-10-25 02:33 | 只看该作者
#14
Full Prime Number

All the numbers that can be read with two or more adjacent digits inside a prime number are also prime numbers. What is the greatest number having this property?

Exampe:6173 is such a number. Because 61, 17, 73, 617, 173 and 6173 are prime numbers

在一个素数中,所有相邻两位或两位以上的数字也构成了素数。具备这种属性的最大素数是多少?
例如,6173就是这样的一个数,因为 61, 17, 73, 617, 173 和 6173 都是素数。

具备这种条件的素数很少,所以是很容易找的。

使用道具 举报

回复
论坛徽章:
484
ITPUB北京香山2007年会纪念徽章
日期:2007-01-24 14:35:02ITPUB北京九华山庄2008年会纪念徽章
日期:2008-01-21 16:50:24ITPUB北京2009年会纪念徽章
日期:2009-02-09 11:42:452010新春纪念徽章
日期:2010-03-01 11:04:552010数据库技术大会纪念徽章
日期:2010-05-13 10:04:272010系统架构师大会纪念
日期:2010-09-04 13:35:54ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512011新春纪念徽章
日期:2011-02-18 11:43:32ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:54
232#
发表于 2012-10-25 03:08 | 只看该作者
newkid 发表于 2012-10-25 02:33
#14
Full Prime Number

两位素数做个connect by,就可以找出候选数了
当然,还是用递归来得好点,可以提前过滤掉很多不合格的解

用pl/sql等过程语言的话,从两位素数开始,在后面添1/3/7/9,看看新形成的数字是否满足要求,不满足的就筛掉,满足的就继续往下找

最大的数能有几位呢?
显然,第一位可以是奇数也可以是偶数,我们先考察第二位及之后的数字
后续任何一位上的数字只能是1/3/7/9之一,而3和9是3的倍数,因此不可能连续出现,否则就可以被3整除了,而1和7的总共出现次数肯定不能超过2次,因为二者除以3都余1,所以一旦总共出现3次,那么后面的几位数一定可以被3整除
所以从第二位开始,最多可以有5位数,用正则表达式表示就是
[39][17][39][17][39]
如此一来,第一位必然不能是3/6/9,而如果是1/4/7,则最多只能有4位,即[147][39][17][39],如果是2/5/8,则最多就两位,即[258][39]
如果第一位没有,或者说第一位是0,那么最多就可能是5位数,由于第一位可以是偶数,所以5位数可能是
[369][17][39][17][39]

使用道具 举报

回复
论坛徽章:
484
ITPUB北京香山2007年会纪念徽章
日期:2007-01-24 14:35:02ITPUB北京九华山庄2008年会纪念徽章
日期:2008-01-21 16:50:24ITPUB北京2009年会纪念徽章
日期:2009-02-09 11:42:452010新春纪念徽章
日期:2010-03-01 11:04:552010数据库技术大会纪念徽章
日期:2010-05-13 10:04:272010系统架构师大会纪念
日期:2010-09-04 13:35:54ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512011新春纪念徽章
日期:2011-02-18 11:43:32ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:54
233#
发表于 2012-10-25 03:45 | 只看该作者
lastwinner 发表于 2012-10-25 03:08
两位素数做个connect by,就可以找出候选数了
当然,还是用递归来得好点,可以提前过滤掉很多不合格的解 ...

由于题目已经给出了6173,所以更大的数就可能是(仅从可被3整除和不是偶数来看)
[7][39][17][39],总共8种可能
[69][17][39][17],总共16种可能
[69][(17)|(71)][39],总共8种可能
[369][17][39][17][39],总共48种可能

如果在上述可能里找不到满足条件的数或者找到的比6173小,那么,最大的数就是6173

自己人肉到一个最大的四位数9719,猜测这就是最大数了
9737和9731都不是素数,所以9开头的不可能凑成5位数,也不可能大于9719
31开头的也不靠谱,37973很可惜是个合数
再考察6开头的,61开头的没戏,67开头的67379是合数,很可惜
所以我认为,最大的满足条件的数就是9719了

使用道具 举报

回复
论坛徽章:
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#
 楼主| 发表于 2012-10-25 04:04 | 只看该作者
61979 ?

使用道具 举报

回复
论坛徽章:
484
ITPUB北京香山2007年会纪念徽章
日期:2007-01-24 14:35:02ITPUB北京九华山庄2008年会纪念徽章
日期:2008-01-21 16:50:24ITPUB北京2009年会纪念徽章
日期:2009-02-09 11:42:452010新春纪念徽章
日期:2010-03-01 11:04:552010数据库技术大会纪念徽章
日期:2010-05-13 10:04:272010系统架构师大会纪念
日期:2010-09-04 13:35:54ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512011新春纪念徽章
日期:2011-02-18 11:43:32ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:54
235#
发表于 2012-10-26 00:59 | 只看该作者
本帖最后由 lastwinner 于 2012-10-26 01:04 编辑
newkid 发表于 2012-10-25 04:04
61979 ?

昨天我做这个题的时候,用到的一个辅助网页
http://zh.nl.numberempire.com/61979

使用道具 举报

回复
论坛徽章:
484
ITPUB北京香山2007年会纪念徽章
日期:2007-01-24 14:35:02ITPUB北京九华山庄2008年会纪念徽章
日期:2008-01-21 16:50:24ITPUB北京2009年会纪念徽章
日期:2009-02-09 11:42:452010新春纪念徽章
日期:2010-03-01 11:04:552010数据库技术大会纪念徽章
日期:2010-05-13 10:04:272010系统架构师大会纪念
日期:2010-09-04 13:35:54ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512011新春纪念徽章
日期:2011-02-18 11:43:32ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:54
236#
发表于 2012-10-26 01:03 | 只看该作者
979=11 * 89,所以我才说61开头的没戏

使用道具 举报

回复
论坛徽章:
484
ITPUB北京香山2007年会纪念徽章
日期:2007-01-24 14:35:02ITPUB北京九华山庄2008年会纪念徽章
日期:2008-01-21 16:50:24ITPUB北京2009年会纪念徽章
日期:2009-02-09 11:42:452010新春纪念徽章
日期:2010-03-01 11:04:552010数据库技术大会纪念徽章
日期:2010-05-13 10:04:272010系统架构师大会纪念
日期:2010-09-04 13:35:54ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512011新春纪念徽章
日期:2011-02-18 11:43:32ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:54
237#
发表于 2012-10-26 01:07 | 只看该作者
another辅助页:http://zhidao.baidu.com/question/5644722.html
查表还是要快很多
剩下的诸如3131和91肯定是合数,这个是人脑的结果

使用道具 举报

回复
论坛徽章:
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
238#
 楼主| 发表于 2012-10-26 02:48 | 只看该作者
花花的肉果然强大:


WITH t0 AS (
    SELECT 2*ROWNUM+1 rn FROM DUAL CONNECT BY ROWNUM <= (100000)/2-1-1
    ),
t as(SELECT rn from t0
      where mod(rn,3)<>0
            and mod(rn,5)<>0
            and mod(rn,7)<>0
    )
,p AS (
SELECT TO_CHAR(rn) n,LENGTH(rn) len
   FROM (SELECT rn from t
         MINUS
         SELECT t1.rn * t2.rn
           FROM t t1, t t2
         WHERE t1.rn <= t2.rn
               AND t1.rn BETWEEN 11 AND (SELECT SQRT(100000) FROM DUAL)
               AND t1.rn * t2.rn <100000
       )
WHERE rn>10
)
,t2 AS (
SELECT p1.n||substr(p2.n,2) AS n
  FROM p p1, p p2, p
WHERE p1.len=2 AND p2.len=2
       AND SUBSTR(p1.n,2)=substr(p2.n,1,1) AND p1.n||substr(p2.n,2) =p.n
)
,t3 AS (
SELECT t21.n||substr(t22.n,3) AS n
  FROM t2 t21,t2 t22,p
WHERE SUBSTR(t21.n,2)=substr(t22.n,1,2) AND t21.n||substr(t22.n,3)=p.n
)
,t4 AS (
SELECT t31.n||substr(t32.n,4) AS n
  FROM t3 t31,t3 t32,p
WHERE SUBSTR(t31.n,2)=substr(t32.n,1,3) AND t31.n||substr(t32.n,4)=p.n
)
SELECT * FROM t4;

no rows selected

可见5位数的没有答案,改用4位:

WITH t0 AS (
    SELECT 2*ROWNUM+1 rn FROM DUAL CONNECT BY ROWNUM <= (100000)/2-1-1
    ),
t as(SELECT rn from t0
      where mod(rn,3)<>0
            and mod(rn,5)<>0
            and mod(rn,7)<>0
    )
,p AS (
SELECT TO_CHAR(rn) n,LENGTH(rn) len
   FROM (SELECT rn from t
         MINUS
         SELECT t1.rn * t2.rn
           FROM t t1, t t2
         WHERE t1.rn <= t2.rn
               AND t1.rn BETWEEN 11 AND (SELECT SQRT(100000) FROM DUAL)
               AND t1.rn * t2.rn <100000
       )
WHERE rn>10
)
,t2 AS (
SELECT p1.n||substr(p2.n,2) AS n
  FROM p p1, p p2, p
WHERE p1.len=2 AND p2.len=2
       AND SUBSTR(p1.n,2)=substr(p2.n,1,1) AND p1.n||substr(p2.n,2) =p.n
)
,t3 AS (
SELECT t21.n||substr(t22.n,3) AS n
  FROM t2 t21,t2 t22,p
WHERE SUBSTR(t21.n,2)=substr(t22.n,1,2) AND t21.n||substr(t22.n,3)=p.n
)
SELECT * FROM t3;

N
-----------------------
9719
6131
3137
1373
6173
3797
6197

7 rows selected.

Elapsed: 00:00:00.89

最大确实是9719。

使用道具 举报

回复
论坛徽章:
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
239#
发表于 2012-10-26 12:26 | 只看该作者
udfrog 发表于 2012-10-18 10:16
嗯,差不多

看不懂
SQL> set timi on
SQL> with df as (
  2  select (rownum+1)*(rownum+1) df from dual connect by rownum<=20),
  3  t as (
  4  select rownum f from dual connect by rownum<=1000),
  5  tmp as (
  6  select        min(df*f) keep (dense_rank first order by df*f) r, row_number() over (order by df*f) rn
  7  from        df, t
  8  group by df*f)
  9  select        min(a.r)-2
10  from        tmp a, tmp b
11  where        a.r=b.r+4
12  and        a.rn=b.rn+4;

MIN(A.R)-2
----------
       846

已用时间:  00: 00: 00.07

使用道具 举报

回复
论坛徽章:
93
生肖徽章2007版:牛
日期:2012-08-02 22:43:00紫蛋头
日期:2012-12-08 09:43:38鲜花蛋
日期:2012-11-17 12:02:07鲜花蛋
日期:2013-02-05 21:53:34复活蛋
日期:2012-11-17 12:02:07SQL极客
日期:2013-12-09 14:13:35SQL数据库编程大师
日期:2013-12-06 13:59:43SQL大赛参与纪念
日期:2013-12-06 14:10:50ITPUB季度 技术新星
日期:2012-11-27 10:16:10最佳人气徽章
日期:2013-03-19 17:24:25
240#
发表于 2012-10-26 13:37 | 只看该作者
〇〇 发表于 2012-10-26 12:26
看不懂
SQL> set timi on
SQL> with df as (

因为5个数连续,所以
a.r=b.r+4
and        a.rn=b.rn+4;

使用道具 举报

回复

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

本版积分规则 发表回复

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