鱼C论坛

 找回密码
 立即注册
查看: 2030|回复: 17

[技术交流] 小练习 20170605 考察可以写成各位数之和的幂的数字

[复制链接]
发表于 2017-6-4 21:23:20 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 冬雪雪冬 于 2017-6-12 16:23 编辑

从现在开始我们要开展一批欧拉计划的习题练习。
其实在我们论坛中已有欧拉计划的板块,可能有些鱼油还没注意到。
什么是欧拉计划:http://bbs.fishc.com/thread-60405-1-1.html
我们欧拉板块现已给出了200余题,这批练习将从欧拉计划中选题。其实用python语言完成有很多的优势,可以更简洁更方便的实现。
如果大家有兴趣也可浏览欧拉的英文网站:https://projecteuler.net/archives
这里已经有了500余题。


                               
登录/注册后可看大图


题目要求:
以python语言完成,如果是python2请注明。
程序以代码文字格式发帖。
注重程序效率和创意。
答题在一周内完成,即6.12 10:00之前,其后将公开大家的答案,并评比成绩。

另程序和答案可以在网上搜到,希望大家独立完成。题目不难,大家看看谁的效率高。

----回帖需写明解题思路,鼓励在程序中加上注释


一些鱼油反映题目有些过难,为此略过一部分偏难的题目。





题目:

512 是有趣的,因为他正好等于他的各位数字之和的幂: 5 + 1 + 2 = 8,  83 = 512。另外一个有这个性质的数字是 614656=284

我们定义 an 为这个数列中的第 N 个元素,当然,起码得是两位数以上,才能求和。

已知 a2=512,a10=614656

请找出 A30。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-6-5 12:03:10 | 显示全部楼层
这题很简单啊,一行代码搞定
  1. print(sorted([i**j for i in range(3, 100) for j in range(2, 100) if sum((int(e) for e in str(i**j))) == i])[29])
复制代码

248155780267521
思路就是穷举前100个数的100次方,看符合的就记录下来,然后排序输出。

评分

参与人数 1荣誉 +10 鱼币 +10 收起 理由
冬雪雪冬 + 10 + 10

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-5 12:39:29 | 显示全部楼层
  1. series = []
  2. for i in range(2, 1000):
  3.     for j in range(2, 100):
  4.         a = i**j
  5.         if sum(map(int, str(a))) == i:
  6.             series.append(a)
  7. series.sort()
  8. print(series[29])
复制代码

结果是248155780267521

评分

参与人数 1荣誉 +10 鱼币 +10 收起 理由
冬雪雪冬 + 10 + 10

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-5 18:12:26 | 显示全部楼层
  1. import math

  2. i = 10
  3. result = []
  4. while len(result) < 10:
  5.     total = sum(map(int, str(i)))
  6.     if total != 1 and round(math.log(i, total), 7) % 1 == 0:
  7.         i += 1
  8.         result.append(i)
  9.     else:
  10.         i += 1
  11. print(result[-1])
复制代码

我好想冬雪算算这个,看看多久出结果。

  1. def ep119():
  2.     arr = sorted(list(set([i**j for i in range(2, 70) for j in range(2, 70)])))
  3.     result = []
  4.     for each in arr:
  5.         if each >= 10 and sum(map(int, str(each))) != 1 and round(math.log(each, sum(map(int, str(each)))), 7) % 1 == 0:
  6.             result.append(each)
  7.         if len(result) == 30:
  8.             break
  9.     print(result[-1])

  10. ep119()
复制代码

但是我总感觉,第二种用筛选的方法上面逻辑不严谨,不知道有没有人解惑。之所以选70,是因为我先做了一个1000**1000的大列表求出的答案,然后反过来缩小范围的。
输出:
  1. 248155780267521
  2. Total used 0.009997s, loops: 1.
复制代码

评分

参与人数 1荣誉 +10 鱼币 +10 收起 理由
冬雪雪冬 + 10 + 10

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-6 00:58:07 | 显示全部楼层
  1. import math
  2. import time

  3. start=time.time()
  4. c=[]
  5. num=1
  6. while True:
  7.     num+=1    #从2的次幂开始判断
  8.     mi=2       #从2次幂开始判断
  9.     while True:
  10.         tex=str(num**mi)
  11.         cd=len(str(num**mi))   #长度cd即数字的位数,相当于10的cd次方
  12.         
  13.         if num==eval('+'.join(tex)): #题设转为n的m次幂的各位数字之和等于n
  14.             c.append((num**mi,num,mi))#记录每一个找到的数字
  15.         
  16.         if mi>cd/(math.log10(9*cd))+1:  #数字的次幂不可能无限增加,有个上限
  17.                break
  18.         mi+=1
  19.     if len(c)>=30:
  20.         break
  21. c.sort()

  22. print(c[29])

  23. print ('sec:'+str(time.time()-start))
复制代码


终于解出一个了…………
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-7 11:06:06 | 显示全部楼层
本帖最后由 china25qd 于 2017-6-7 11:12 编辑

小明式的代码(运行了一下午才得到结果
  1. listNum = []
  2. num = 10
  3. break1 = 1#外层循环体控制量
  4. lenlist = int(input("请输入想要结果的个数:"))
  5. while break1:
  6.     num += 1#取一个大于10的整数,每次+1
  7.     sum_i = 0#初始化个位数字之和
  8.     for i in str(num):
  9.         sum_i += int(i)#先把整数变成字符串,然后一个个取出,转化为整型,再加起来
  10.     power = 1#初始化幂为1
  11.     break2 = 1#内层循环体控制量
  12.     while break2:
  13.         power += 1#从2次幂开始,每圈+1次幂
  14.         n = sum_i ** power#计算出结果
  15.         if n == int(num):
  16.             listNum.append(num)#如果各位数字之和的幂等于结果,则写入数组
  17.         elif n > int(num):
  18.             break2 = 0#如果各位数字之和的幂大于结果,则跳出本次循环
  19.         elif n == 1:
  20.             break2 = 0#特殊情况,100或1000之类的数导致n==1,会变成死循环,所以当n==1时,直接跳出本次循环
  21.     if len(listNum) >= lenlist:
  22.         break1 = 0#如果listNum里写了指定个数字,则跳出外层循环
  23.     print(len(listNum))
  24. for j in listNum:
  25.     print(j)#打印结果
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-8 09:54:00 | 显示全部楼层
什么题,题目乱七八糟的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-9 15:46:13 | 显示全部楼层
顺向思维就入坑了,根本算不到A30。。。
  1. a = []
  2. for i in range(2,100):
  3.     for j in range(2,50):
  4.         x = i ** j
  5.         sum1 = sum([int(i) for i in str(x)])
  6.         if i == sum1:
  7.             print(i,j,x)
  8.             a.append(x)
  9. a.sort()
  10. print(a[29])
复制代码


248155780267521

评分

参与人数 1荣誉 +10 鱼币 +10 收起 理由
冬雪雪冬 + 10 + 10

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-10 01:03:15 | 显示全部楼层
这个代码我找出几个数,但是到后面找不出了,效率不高。
  1. tag1 = 1
  2. tag2 = 100000
  3. def find(tag1,tag2):
  4.     print("查找中,范围:"+str(tag1)+"-"+str(tag2)+".时间较长......")
  5.     for i in range(tag1,tag2):
  6.         res = 0
  7.         x = 2
  8.         for j in str(i):
  9.             res += int(j)
  10.         if(res == 1):
  11.             find(i+1,tag2)        
  12.         while(res**x < i):
  13.             x += 1
  14.             if(res**x == i):
  15.                 print("\n"+str(i)+"!!!!!!!!"+str(x)+"!!!!\n")   
  16.         if(i == tag2 - 1):
  17.             print("加强力度查找!")
  18.             find(tag2,tag1+tag2)
  19. find(tag1,tag2)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-10 08:39:21 | 显示全部楼层
  1. numlist=[]
  2. def func(i):
  3.     r=i
  4.     global numlist
  5.     t=0
  6.     while len(str(r))<i and t<2*r:
  7.         r*=i
  8.         t=sumofs(r)
  9.         if t==i:
  10.             numlist.append(r)
  11.             

  12. i=2
  13. while True:
  14.     func(i)
  15.     if len(numlist)>=30:
  16.         numlist.sort()
  17.         t=len(str(numlist[29]))
  18.         if i>t*9:
  19.             break
  20.     i+=1
复制代码


248155780267521

评分

参与人数 1荣誉 +10 鱼币 +10 收起 理由
冬雪雪冬 + 10 + 10

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-12 16:00:07 | 显示全部楼层
楼主题目可以写的明白点吗 83 =  512 是 8^3吗,284是 24^4
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-6-12 16:27:51 | 显示全部楼层
keweel 发表于 2017-6-12 16:00
楼主题目可以写的明白点吗 83 =  512 是 8^3吗,284是 24^4

虚心接受批评,已改正。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-12 17:07:50 | 显示全部楼层
冬雪雪冬 发表于 2017-6-12 16:27
虚心接受批评,已改正。

没有批评啦, 就是建议下而已,毕竟我怕题目都看不懂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-6-12 17:18:07 | 显示全部楼层
keweel 发表于 2017-6-12 17:07
没有批评啦, 就是建议下而已,毕竟我怕题目都看不懂

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-6-12 22:47:13 | 显示全部楼层
奔跑的小鱼 发表于 2017-6-8 09:54
什么题,题目乱七八糟的

抱歉,帖子编写时,上标没有做好。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-13 09:13:42 | 显示全部楼层
冬雪雪冬 发表于 2017-6-12 16:27
虚心接受批评,已改正。

版主大大你把我漏了,我也算对了啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-6-13 09:57:30 | 显示全部楼层
小剑剑 发表于 2017-6-13 09:13
版主大大你把我漏了,我也算对了啊

是的,不知怎么了,这几阵子老犯错,是不是老年痴呆了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-6-13 18:36:51 | 显示全部楼层
ooxx7788 发表于 2017-6-5 18:12
我好想冬雪算算这个,看看多久出结果。

我的算法不好,很费时间。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-20 22:48

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表