Python3 欧拉计划 问题21-25

EulerProject.png

问题16-20参见:http://www.jianshu.com/p/63b4f80bd84e

21、亲和数

  记d(n)为n的所有真因数(小于n且整除n的正整数)之和。如果d(a) = b且d(b) = a,且a ≠ b,那么a和b构成一个亲和数对,a和b被称为亲和数。例如,220的真因数包括1、2、4、5、10、11、20、22、44、55和110,因此d(220) = 284。284的真因数包括1、2、4、71和142,因此d(284) = 220。说明284和220是亲和数
  求所有小于10000的亲和数的和。

Python3解答
def fan_sum(number):#计算真因数的和
    hu=[1]
    for i in range(2,int(number**0.5)+1):
        if number%i==0 and number>i:
            hu.append(i)
            if number!=i**2:
                hu.append(number/i)
    return sum(f for f in hu)
an_dict={}
for i in range(1,10001):
    an_dict[i]=fan_sum(i)#存储真因数和的字典

fan=0
for i in range(1,10001):    
    try:
        if an_dict[an_dict[i]]==i and an_dict[i]!=i:#寻找d[a]=b and d[b]= a
            fan+=i
    except KeyError:
        pass
print(fan)
答案:31626

22、姓名之分

  文本names.txt中包含了五千多个姓名,首先将姓名按字母顺序排列,然后算出每个姓名字母的和值,最后乘以该姓名排列后的位置,以计算出姓名之分。例如,按照字母顺序排列后,姓名COLIN的位置是938,其字母的和值是3 + 15 + 12 + 9 + 14 = 53。因此COLIN的姓名之分是938 × 53 = 49714。
  计算文件中所有姓名的姓名之分的和。

Python3解答
with open(r'C:\Users\GWT9\Desktop\secries11.txt')as an_file:#读取姓名数据
    fan=an_file.read()
    fan_an= sorted(fan.replace('"', '').split(','))#姓名排序
def fan_sumq(stit):#计算姓名的字母的和值
    return sum(ord(i)-64 for i in stit)
print(sum(fan_sumq(fan_an[i])*(i+1) for i in range(0,len(fan_an))))
答案: 871198282

23、非盈数之和的和

  完全数是指真因数之和等于自身的那些数。例如,28的真因数之和为1 + 2 + 4 + 7 + 14 = 28,因此28是一个完全数。一个数n被称为亏数,如果它的真因数之和小于n;反之则被称为盈数。由于12是最小的盈数,它的真因数之和为1 + 2 + 3 + 4 + 6 = 16,所以最小的能够表示成两个盈数之和的数是24。通过数学分析可以得出,所有大于28123的数都可以被写成两个盈数的和;因此28123是不能被分成两个盈数的和的最大的数的上界。
  找出所有不能被写成两个盈数之和的正整数的和。

Python3解答
def fan_sum(number):#判断是否是盈数
    hu=[1]
    for i in range(2,int(number**0.5)+1):
        if number%i==0 and number>i:
            hu.append(i)
            if number!=i**2:
                hu.append(number/i)
    if sum(i for i in hu)>number:
        return True
    
def an_sum(number):
    an,fan=set(),0
    for i in range(1,number+1):
        if fan_sum(i):
            an.add(i)
        if not any((i-j) in an for j in an):#判断是否可以写成两个盈数的和
            fan+=i
    return fan
print(an_sum(28123))
答案:4179871

24、字典序排列

  排列指的是将一组物体进行有顺序的放置。例如,3124是数字1、2、3、4的一个排列。如果把所有排列按照数字大小或字母先后进行排序,我们称之为字典序排列。0、1、2的字典序排列是:012 021 102 120 201 210 。
  数字0、1、2、3、4、5、6、7、8、9的字典序排列中第一百万位的排列是。

Python3解答
#思路:100万=a*9!+b*8!+……+k*0!
def an_pro(num):#计算阶乘
    if num==0:
        return 1
    else:
        nu=1
        while num>0:
            nu*=num
            num-=1
        return nu
#计算每个阶乘前面的数字的位置编号
def fan_lis(number):#number=100万,count=10,lis存储过程中的数字
    anlist=[]#存储过程中的数字
    digitcount=9
    while number>=0:
        jiecheng=an_pro(digitcount)#计算count个数字的全排列组成的数字个数
        ji=int(number/jiecheng)#计算阶乘倍数
        anlist.append(ji)#存储
        nu=ji*jiecheng
        number-=nu
        digitcount-=1
        if digitcount==0:
            break
    anlist.append(0)
    return anlist
fan=fan_lis(999999)#第100万位的数字
#将上面程序的位置编号转化为对应的数字
fanfan=list(range(0,10))
fan_an=[]#存储对应的数字
for i in range(0,len(fan)):
    fan_an.append(fanfan[fan[i]])
    fanfan.remove(fanfan[fan[i]])
#输出最终的数字  
an_str=''
for i in fan_an:
    an_str+=str(i)#最终输出数字
print(an_str)
答案:2783915460

25、1000位的斐波那契数

  斐波那契数列是按如下递归关系定义的数列:
      F1 = 1 F2 = 1
      Fn = Fn−1 + Fn−2
因此斐波那契数列的前12项分别是:
F1 = 1
F2 = 1
F3 = 2
F4 = 3
F5 = 5
F6 = 8
F7 = 13
F8 = 21
F9 = 34
F10 = 55
F11 = 89
F12 = 144
不难看出,第一个有3位数字的是第12项F12。
  在斐波那契数列中,第一个有1000位数字的是第几项。

Python3解答
def an_fib(num):
    an,fan,an_fan=1,1,2
    while len(str(fan))<num:#判断位数
        an_fan+=1
        an,fan=fan,an+fan#斐波那契序列
    return an_fan
print(an_fib(1000))
答案:4782

持续更新,欢迎讨论,敬请关注!!!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,658评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,482评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,213评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,395评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,487评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,523评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,525评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,300评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,753评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,048评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,223评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,905评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,541评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,168评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,417评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,094评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,088评论 2 352

推荐阅读更多精彩内容