楼主: 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
101#
 楼主| 发表于 2010-12-17 13:14 | 只看该作者
今天一下子做了4道题, 虽说都不难, 歇一歇。
恰逢上个帖子是100楼, 庆贺一下。

使用道具 举报

回复
论坛徽章:
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
102#
发表于 2010-12-17 14:32 | 只看该作者
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
103#
 楼主| 发表于 2010-12-17 14:41 | 只看该作者
原帖由 lastwinner 于 2010-12-17 14:32 发表
NB真不是吹的,楼主太厉害了!


好多题的做法还有很大的改进余地, 大家一起努力把。

使用道具 举报

回复
论坛徽章:
211
国际米兰
日期:2010-01-11 10:26:28ITPUB评论家
日期:2007-11-04 01:35:51季节之章:春
日期:2011-04-03 16:30:30热刺
日期:2009-09-21 10:54:48天枰座
日期:2015-11-05 16:32:03月度论坛发贴之星
日期:2010-05-01 02:15:42生肖徽章:狗
日期:2006-10-01 00:29:23BLOG每周发帖之星
日期:2009-08-30 01:35:31BLOG每日发帖之星
日期:2009-08-28 01:01:02妮可·罗宾
日期:2016-10-19 10:45:04
104#
发表于 2010-12-17 16:40 | 只看该作者
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
105#
 楼主| 发表于 2010-12-17 22:48 | 只看该作者
每次做完一道题, 都很希望能看到题目后面能有euler给出的文档。 每次看后都能有进一步的收获。
不过可惜的是很多题目都没有文档(也许是太简单了)

这次,文档中给出了通过一个数的质因数分解, 来得到因数和的方法。
在文档中只列出了代码, 具体的推导方法给出了链接: http://mathschallenge.net/index. ... ber/sum_of_divisors

简单的说,结论就是:
如果一个数的质因数分解是p^a,
则他的因数和(包括自身在内)是:  (p^(a+1) - 1)/(p-1)

根据相乘性 σ(a×b×...)=σ(a)×σ(b)×...:
对于质因数分解p^a * q^b *....
则他的因数和(包括自身在内)是: (p^(a+1) - 1)/(p-1)   * (q^(b+1) -1) /(q-1) * .....


链接中没有对可乘性进行证明,我来把这个证明补充一下:
设S=A*B,  A= p^m,  B=q^n, pq互质
则A的因数为:  1, p, p^2,.. ,p^m
B的因数为:     1, q, q^2,... , q^n
S的因数为:   1, p, p^2,.. ,p^m,  q, q^2,... , q^n, p*(q, q^2,.... q^n), p^2 * (q, q^2,... q^m) + .... P^m(q, q^2,...q^n)
因为pq互质, 所以上面的除1以外的所有因数都互不相等,
所以S的因数和
σ(S) = 1 + (σ(A)-1) + (σ(B)-1) + p*(σ(B)-1) + p^2* (σ(B)-1) + p^m* (σ(B)-1)
       = 1+  (σ(A)-1) + (1+p+p^2+... +P^n) * (σ(B)-1)
       = 1+  (σ(A)-1) +  (σ(A) * (σ(B)-1)
       = σ(A) + σ(A) * (σ(B)-1) = σ(A) * σ(B)

[ 本帖最后由 tree_new_bee 于 2010-12-17 22:55 编辑 ]

使用道具 举报

回复
论坛徽章:
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
106#
发表于 2010-12-17 23:19 | 只看该作者
94楼的解法很巧妙,为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
107#
 楼主| 发表于 2010-12-18 00:41 | 只看该作者
Q21 根据提示改写后的plsql代码:
declare
  sm number;
  type tnumlist is table of number index by pls_integer;
  numlist tnumlist;
  
j number;
icopy number;
step number;
cnt number;
begin
  for i in 1..10000 loop
        cnt := 0;
        sm := 1;
        if bitand(i,1)= 0 then step:=1; else step:=2; end if; --奇数的质因子中不会有偶数,可以跳过偶数
        icopy := i;
        j := 2;
        while j*j<=icopy loop
            while  j<=icopy and mod(icopy,j) = 0 loop
               icopy := icopy/j;
               cnt:=cnt+1;
            end loop;
           if cnt>0 then sm := sm * (power(j,cnt+1)-1)/(j-1); end if;
           cnt:=0;
           if j=2 then j:=j+1; else j:=j+step; end if;
        end loop;
        if icopy>1 then sm:=sm*(icopy+1); end if;  --icopy+1 == (icopy^2-1)/(icopy-1)
        numlist(i) := sm-i;
  end loop;
  
   sm := 0;
  for i in 1 .. 10000 loop
    if numlist.exists(numlist(i)) then
      if i = numlist(numlist(i)) and i <> numlist(i) then
        sm := sm + i ;
      end if;
    end if;
  end loop;
  dbms_output.put_line('sum is: ' || sm);
end;
SQL> /

sum is: 31626

PL/SQL procedure successfully completed

Executed in 0.312 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
108#
 楼主| 发表于 2010-12-18 00:47 | 只看该作者
Q22 What is the total of all the name scores in the file of first names?
Using names.txt (right click and 'Save Link/Target As...'), a 46K text file containing over five-thousand first names, begin by sorting it into alphabetical order. Then working out the alphabetical value for each name, multiply this value by its alphabetical position in the list to obtain a name score.

For example, when the list is sorted into alphabetical order, COLIN, which is worth 3 + 15 + 12 + 9 + 14 = 53, is the 938th name in the list. So, COLIN would obtain a score of 938 × 53 = 49714.

What is the total of all the name scores in the file?


这个题目没难度, 正好用用很少用的oracle内的文件操作。
用external table 来读取。


create  table euler_names(
fname varchar2 (20)
)
ORGANIZATION EXTERNAL (
       TYPE ORACLE_LOADER
       DEFAULT DIRECTORY euler_dir
       ACCESS PARAMETERS
       (
         records delimited by ','
         badfile euler_dir:'euler%a_%p.bad'
         logfile euler_dir:'euler%a_%p.log'
         fields ENCLOSED BY '"'
         (fname)
       )
       LOCATION ('euler_names.txt')
);

with t0 as (select rownum n from dual connect by rownum<=20)
, t as (select fname, row_number() over (order by fname) rk from euler_names)
,t1 as (select fname, rk, sum(ASCII(substr(fname,n,1))-64) weight
from t,t0 where n<=length(fname)  group by fname, rk)
select sum(rk*weight) from t1


SUM(RK*WEIGHT)
--------------
     871198282

使用道具 举报

回复
论坛徽章:
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
109#
 楼主| 发表于 2010-12-18 00:48 | 只看该作者
刚看到,另一个euler的帖子也打开了。
先去看看已做过的。 没做过的还是先不看了。

使用道具 举报

回复
论坛徽章:
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
110#
发表于 2010-12-18 01:10 | 只看该作者
107楼的j:=j+step换成对质数表遍历怎么样?不过反正你才在100之内循环,不用那么麻烦了。

使用道具 举报

回复

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

本版积分规则 发表回复

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