楼主: tree_new_bee

Euler Project 挨个做- 之二 (Q51-Q78)

[复制链接]
论坛徽章:
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
171#
发表于 2011-1-14 10:30 | 只看该作者
原帖由 zhangweicai74 于 2011-1-14 09:19 发表
最近没见奥数哥光临了。

他说对哥德巴赫猜想有了新思路,在研究呢!(不是瞎说的)

使用道具 举报

回复
论坛徽章:
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
172#
 楼主| 发表于 2011-1-14 10:55 | 只看该作者
原帖由 newkid 于 2011-1-14 10:30 发表

他说对哥德巴赫猜想有了新思路,在研究呢!(不是瞎说的)


民间科学家总是对哥德巴赫猜想和永动机趋之若鹜。

使用道具 举报

回复
论坛徽章:
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
173#
发表于 2011-1-14 23:57 | 只看该作者
原帖由 tree_new_bee 于 2011-1-14 10:55 发表


民间科学家总是对哥德巴赫猜想和永动机趋之若鹜。


哈哈,“和尚动得,我动不得?”(阿Q)

我感觉奥数哥应该是官方数学家,祝福他成功!

使用道具 举报

回复
论坛徽章:
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
174#
 楼主| 发表于 2011-1-25 11:47 | 只看该作者
这段时间很忙, 先歇歇回头再继续。

使用道具 举报

回复
论坛徽章:
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
175#
 楼主| 发表于 2012-2-8 15:01 | 只看该作者
tree_new_bee 发表于 2011-1-25 11:47
这段时间很忙, 先歇歇回头再继续。

说歇了歇,一下子就歇了一年。


准备再继续。

使用道具 举报

回复
论坛徽章:
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
176#
 楼主| 发表于 2012-2-8 15:09 | 只看该作者
tree_new_bee 发表于 2011-1-13 22:20
题目看起来很简单, 要是小一点的上界, 怎么都好做。
但1500000实在是个恐怖的数字。
题目看起来很简单, 要是小一点的上界, 怎么都好做。
但1500000实在是个恐怖的数字。

用wiki里这个公式:
    a = m2 − n2,
    b = 2mn,
    c = m2 + n2

其中m,n互质, 可以产生素勾股数
要产生所有勾股数, 只要在上面的基础上乘上自然数k就行。
问题是, 前一步的素勾股数可以很快产生, 所有的素勾股数*k,这一步也很慢。

这里引用错误。  m,n除了互质外,还要保证两个奇偶不同。

按照这个思路,用SQL来写:

  1. with targ as (select 150000 arg from dual)
  2. ,tmn as (select level d from targ connect by level<=sqrt(arg/2))
  3. , tp as (select tm.d m, tn.d n, least((tm.d*tm.d - tn.d*tn.d),(2*tm.d*tn.d)) a, greatest((tm.d*tm.d - tn.d*tn.d),(2*tm.d*tn.d)) b, (tm.d*tm.d + tn.d*tn.d) c
  4. ,(tm.d*tm.d *2  + 2*tm.d*tn.d )  p
  5. from tmn tm, tmn tn, targ
  6. where tm.d>tn.d
  7. and (tm.d*tm.d *2  + 2*tm.d*tn.d ) <arg
  8. and pkg_prim2.gcd(tm.d, tn.d) = 1
  9. and mod(tm.d+tn.d,2) = 1
  10. )
  11. , tmul as (select   a*k a, b*k b, c*k c, p*k p
  12. from tp, targ ,(select level k from targ connect by level<=arg/12) tk
  13. where k <= arg/p)
  14. ,tgroup as (select p, count(*) from tmul group by p having count(*) = 1)
  15. select count(*) from tgroup
  16.   
  17. COUNT(*)
  18. ----------
  19.      16414
复制代码

只是算到150000,就已经要100多秒了。 受不了。


使用道具 举报

回复
论坛徽章:
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
177#
 楼主| 发表于 2012-2-8 15:21 | 只看该作者
本帖最后由 tree_new_bee 于 2012-2-8 15:22 编辑

改成pl/sql 来写:
  1. create or replace procedure p75C is
  2.   arg    number := 1500000;
  3.   type tnumlist is table of number index by BINARY_INTEGER;
  4.   numlist tnumlist;

  5.   a   number;
  6.   b   number;
  7.   c   number;
  8.   p   number;
  9.   p2  number;
  10.   r  number;
  11.   cnt number;
  12. begin
  13.   for m in 2 .. sqrt(arg / 2) loop
  14.     for n in 1 .. m - 1 loop
  15.       if mod(m + n, 2) = 1 and pkg_prim2.gcd(m, n) = 1 then
  16.         a :=least(m*m - n*n, 2*m*n);
  17.         b := greatest(m*m - n*n, 2*m*n);
  18.         c := m * m + n * n;
  19.         p := a + b + c;
  20.         if p > arg then
  21.           exit;
  22.         end if;
  23.       
  24.         for k in 1 .. floor(arg / p) loop
  25.           p2 := p * k;
  26.         
  27.           if numlist.exists(p2) then
  28.             numlist(p2) := numlist(p2)+1;
  29.           else
  30.             numlist(p2) := 1;
  31.           end if;
  32.         
  33.         end loop;
  34.       
  35.       end if;
  36.     end loop;
  37.   
  38.   end loop;

  39.   cnt := 0;
  40.   r     := numlist.first;
  41.   while r is not null loop
  42.     if numlist.exists(r) and numlist(r) = 1 then
  43.       cnt := cnt + 1;
  44.     end if;
  45.     r := numlist.next(r);
  46.   end loop;

  47.   dbms_output.put_line('cnt:' || cnt);
  48. end p75C;
复制代码
这个就快多了。

SQL> exec p75c;

cnt:161667

PL/SQL procedure successfully completed

Executed in 1.482 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
178#
 楼主| 发表于 2012-2-8 16:18 | 只看该作者
本帖最后由 tree_new_bee 于 2012-2-12 17:36 编辑

Q76 How many different ways can one hundred be written as a sum of at least two positive integers?

It is possible to write five as a sum in exactly six different ways:


4 + 1
3 + 2
3 + 1 + 1
2 + 2 + 1
2 + 1 + 1 + 1
1 + 1 + 1 + 1 + 1

How many different ways can one hundred be written as a sum of at least two positive integers?

把100拆成两个以上的正整数的和,有多少种拆法?

使用道具 举报

回复
论坛徽章:
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
179#
 楼主| 发表于 2012-2-8 16:23 | 只看该作者
先搞搞思路:

比如先知道3的拆法有: 1+1+1, 2+1两种
那么4的拆法有:
* 3的拆法后面分别加上一个+1, 得到1+1+1+1, 2+1+1
*3的首位加1, 得到 2+1+1, 3+1
* 3的拆法后面不同的数字加1,  得到 2+2 (如果觉得判断不同数字麻烦,也可以对每个数字都加1,  得到 1+2+1, 1+1+2,  2+2)
把上面的结果加到一起去除重复。



使用道具 举报

回复
论坛徽章:
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
180#
发表于 2012-2-8 20:37 | 只看该作者
tree_new_bee 发表于 2012-2-8 16:23
先搞搞思路:

比如先知道3的拆法有: 1+1+1, 2+1两种

移步过来解36X吧。。http://www.itpub.net/thread-1563734-4-3.html

使用道具 举报

回复

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

本版积分规则 发表回复

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