楼主: 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
21#
 楼主| 发表于 2010-12-13 13:37 | 只看该作者
Q8: Find the greatest product of five consecutive digits in the 1000-digit number.

这个太简单,不写了。

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

使用道具 举报

回复
论坛徽章:
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
22#
发表于 2010-12-13 13:39 | 只看该作者
不错不错,学习学习

使用道具 举报

回复
论坛徽章:
10000
绿钻
日期:2016-02-22 15:43:08绿钻
日期:2016-03-01 18:19:01绿钻
日期:2016-02-22 15:43:08绿钻
日期:2016-03-01 18:19:01绿钻
日期:2015-12-16 18:42:35绿钻
日期:2015-12-11 00:18:01绿钻
日期:2015-09-10 13:05:08绿钻
日期:2015-12-11 00:18:01绿钻
日期:2015-09-10 13:05:08绿钻
日期:2015-09-10 13:05:08
23#
发表于 2010-12-13 14:33 | 只看该作者
强悍!

使用道具 举报

回复
论坛徽章:
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
24#
 楼主| 发表于 2010-12-13 16:19 | 只看该作者
Q9:Find the only Pythagorean triplet, {a, b, c}, for which a + b + c = 1000.

A Pythagorean triplet is a set of three natural numbers, a < b < c, for which,
a^(2) + b^(2) = c^(2)

For example, 3^(2) + 4^(2) = 9 + 16 = 25 = 5^(2).

There exists exactly one Pythagorean triplet for which a + b + c = 1000.
Find the product abc.

单就做这个题,也很easy:

SQL> with t as (select rownum n from dual connect by rownum<=1000/2)
  2  select ta.n a, tb.n b, 1000-ta.n-tb.n c, ta.n * tb.n * (1000-ta.n-tb.n) prod from t ta, t tb
  3  where ta.n<tb.n and
  4  ta.n* ta.n + tb.n*tb.n = (1000-ta.n - tb.n)*(1000-ta.n - tb.n)
  5  /

         A          B          C       PROD
---------- ---------- ---------- ----------
       200        375        425   31875000

Executed in 0.297 seconds


不过,毕竟这是个O(n2)的算法,推广到大数以后,就是个问题了。
Euler的文档中有降低难度的算法, 不过看不明白。

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

使用道具 举报

回复
论坛徽章:
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
25#
 楼主| 发表于 2010-12-13 16:27 | 只看该作者
可以略微优化一点的地方是: 因为a<b<c , 所以a<1000/3,  c>1000/3
c>1000/3 => a+b < 2000/3 => b< 2000/3-a
不过,因为本身很快,所以改善不会太明显。

with t as (select rownum n from dual connect by rownum<=1000/2)
select ta.n a, tb.n b, 1000-ta.n-tb.n c, ta.n * tb.n * (1000-ta.n-tb.n) prod from t ta, t tb
where ta.n<1000/3 and tb.n < 2000/3-ta.n and ta.n<tb.n and
ta.n* ta.n + tb.n*tb.n = (1000-ta.n - tb.n)*(1000-ta.n - tb.n)

Executed in 0.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
26#
 楼主| 发表于 2010-12-13 17:43 | 只看该作者
Q10:Find the sum of all the primes below two million.

直接利用Q7的成果就是了。

public static double findsum(double d)
{
  long i=1;
  double sum;

  if(d==1) return 0;  if(d==2) return 2;
  if(d<=4) return 5;  if(d<=6) return 10;
   
  sum=10; // sum of 2+3+5
  while (i<(d-1)/6)
  {
    if (isprim(i*6+1)==0) sum+= i*6+1;
    if (i*6+5 > d) return sum;
    if (isprim(i*6+5)==0) sum+= i*6+5;
    i++;
  }
  return sum;
}


SQL> select pkg_prim2.jfindsum(2000000) from dual;

PKG_PRIM2.JFINDSUM(2000000)
---------------------------
               142913828922

Executed in 14.078 seconds


用Java都要14秒, PLSQL就懒得再去试了。

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

使用道具 举报

回复
论坛徽章:
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
27#
 楼主| 发表于 2010-12-13 19:41 | 只看该作者
找连续数范围内所有质数,还是用Eratosthenes筛法效率最好。
根据euler文档中的算法改写:

  1. public static double seivesum(double d)
  2. {

  3.   int i,j;
  4.   boolean n[];
  5.   int m = (int)d+1;
  6.   n = new boolean[m] ;
  7.   double sum = 0;

  8.   for (i=1; i<m; i++ ) n[i]=(i % 2==1);
  9.   n[0] = false;  n[1] = false; n[2] = true;

  10.   j = 3;
  11.   while (j<=java.lang.Math.sqrt(d))
  12.   {
  13.        if (n[j] )
  14.          for (i=j*j; i<m; i+=j)  n[i]=false;
  15.        j+=2;
  16.   }

  17.   for (i=2; i<m;i++ ) if (n[i]) sum+=i;
  18.   return sum;
  19. }

  20. SQL> select pkg_prim2.jseivesum(2000000) from dual;

  21. PKG_PRIM2.JSEIVESUM(2000000)
  22. ----------------------------
  23.                 142913828922

  24. Executed in 0.484 seconds
复制代码


效果很惊人!

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

使用道具 举报

回复
论坛徽章:
519
奥运会纪念徽章:垒球
日期: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
28#
发表于 2010-12-13 22:57 | 只看该作者
可怜OO的秘密武器,就这样被维基解密了
关于质数表,以前OO也有贴过,确实是筛选法最快:
http://www.itpub.net/viewthread.php?tid=1244925

使用道具 举报

回复
论坛徽章:
519
奥运会纪念徽章:垒球
日期: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
29#
发表于 2010-12-13 23:14 | 只看该作者
回文数可以用一下这个reverse函数:

with t as (select rownum+100 n from dual connect by rownum<=900)
select max(t1.n*t2.n) from t t1, t t2
--select t1.n, t2.n,t1.n*t2.n from t t1, t t2
where to_char(t1.n*t2.n) = reverse(to_char(t1.n*t2.n))
and t1.n<t2.n;

使用道具 举报

回复
论坛徽章:
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
30#
 楼主| 发表于 2010-12-14 01:08 | 只看该作者
原帖由 newkid 于 2010-12-13 23:14 发表
回文数可以用一下这个reverse函数:



哈,忘了还有这么一个宝贝函数了。

这个reverse函数做函数索引的时候很有用的。

使用道具 举报

回复

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

本版积分规则 发表回复

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