Python练习题 040:Project Euler 012:有超过500个因子的三角形数
本题来自 Project Euler 第12题:https://projecteuler.net/problem=12
# Project Euler: Problem 12: Highly divisible triangular number
# The sequence of triangle numbers is generated by adding the natural numbers.
# So the 7th triangle number would be 1 + 2 + 3 + 4 + 5 + 6 + 7 = 28.
# The first ten terms would be:
# 1, 3, 6, 10, 15, 21, 28, 36, 45, 55, ...
# Let us list the factors of the first seven triangle numbers:
# 1: 1
# 3: 1,3
# 6: 1,2,3,6
# 10: 1,2,5,10
# 15: 1,3,5,15
# 21: 1,3,7,21
# 28: 1,2,4,7,14,28
# We can see that 28 is the first triangle number to have over five divisors.
# What is the value of the first triangle number to have over five hundred divisors?
# Answer: 76576500 import time
startTime = time.clock() def f(x):
c = 0
for i in range(1,int(x**.5)+1):
if x%i == 0:
c += 1
if float(int(x**.5)) == x**.5:
return (c*2-1)
else:
return(c*2) triNumber = 1
natNumber = 1
while f(triNumber) < 500:
natNumber += 1
triNumber += natNumber
f(triNumber)
print(triNumber) print('Time used: %.2d' % (time.clock() - startTime))
所谓“三角形数”,指的是自然数相加后的和,第n个三角形数即是从1开始的n个自然数相加后的和。例如:第5个三角形数就是 1+2+3+4+5=15。而15这个数字拥有的所有因子为:1、3、5、15 这四个数字。本题求解首个拥有 500 个因子的三角形数。
一开始我是这么想的:先写一个函数,用来把任意三角形数的所有因子放进列表 lst 里。之后再写一个 while 循环函数,只要 len(lst) 不超过 500,就不停计算下一个更大的三角形数,直到 len(lst) 超过 500,这个三角形数即为题解。写完了,计算拥有超过 50 个因子的倒还可以,但 500?反正运行了半天也没算出来:判断是否为因子的这几行代码太费时间了。
于是又求助网络(来源网页找不着了,刚才电脑死了一次机),发现有这么一个思路:其实,判断三角形数 x 有多少个因子,根本不需要判断 range(1, x+1) 这么多次,而是大概只需要判断 range(1, int(x**.5)+1) 次,然后把这个次数乘以 2 就行。唯一例外就是:如果 x 开根号后仍是整数,那么次数乘2之后,还得减掉1才行。为什么呢?算法啥的我是不太懂,但观察一下还是能观察出来的:
比如:28(第7个三角形数)的因子是:1、2、4、7、14、28,而根号28(5.3)正好就在4、7中间,处于所有因子的中间,因此只要判断 range(1,6) 就可以得出1/2的次数,之后乘2就可以了。
但是:36(第8个三角形数)的因子是:1、2、3、4、6、9、12、18、36,而根号36正好是6,也正好处于所有因子的中间,但6是其中一个因子,不像上例中的5.3,并非因子。因此,如果判断 range(1,7) 再乘以2,就会多算进一个数字(即因子6被乘2,多算了1个)。因此,在这种开根号正好是整数的情况下,必须把总次数减掉1才行。
如此一开根号,我这破电脑也能在12秒左右算出答案。撒花~~~~~~
Python练习题 040:Project Euler 012:有超过500个因子的三角形数的更多相关文章
- Project Euler 23 Non-abundant sums( 整数因子和 )
题意: 完全数是指真因数之和等于自身的那些数.例如,28的真因数之和为1 + 2 + 4 + 7 + 14 = 28,因此28是一个完全数. 一个数n被称为亏数,如果它的真因数之和小于n:反之则被称为 ...
- Python练习题 025:判断回文数
[Python练习题 025] 一个5位数,判断它是不是回文数.即12321是回文数,个位与万位相同,十位与千位相同. ---------------------------------------- ...
- Python练习题 032:Project Euler 004:最大的回文积
本题来自 Project Euler 第4题:https://projecteuler.net/problem=4 # Project Euler: Problem 4: Largest palind ...
- Python练习题 029:Project Euler 001:3和5的倍数
开始做 Project Euler 的练习题.网站上总共有565题,真是个大题库啊! # Project Euler, Problem 1: Multiples of 3 and 5 # If we ...
- Python练习题 046:Project Euler 019:每月1日是星期天
本题来自 Project Euler 第19题:https://projecteuler.net/problem=19 ''' How many Sundays fell on the first o ...
- Python练习题 039:Project Euler 011:网格中4个数字的最大乘积
本题来自 Project Euler 第11题:https://projecteuler.net/problem=11 # Project Euler: Problem 10: Largest pro ...
- Python练习题 033:Project Euler 005:最小公倍数
本题来自 Project Euler 第5题:https://projecteuler.net/problem=5 # Project Euler: Problem 5: Smallest multi ...
- Python练习题 049:Project Euler 022:姓名分值
本题来自 Project Euler 第22题:https://projecteuler.net/problem=22 ''' Project Euler: Problem 22: Names sco ...
- Python练习题 048:Project Euler 021:10000以内所有亲和数之和
本题来自 Project Euler 第21题:https://projecteuler.net/problem=21 ''' Project Euler: Problem 21: Amicable ...
随机推荐
- SEO大神都是些什么人
http://www.wocaoseo.com/thread-97-1-1.html 貌似好久没有更新seo培训联盟的文章了,最近一直在专心学习其他的东西,前一段写了几篇关于用户需求和体验的文章,但是 ...
- WPF新手快速入门系列 2.绑定
[概要] 上一章讲了布局,按照市面上的书籍每一本讲的顺序都不一样,本系列是希望大家能快速上手去应对工作需要,所以本章就直接开始讲绑定. 如有学习过程中想交流学习.疑惑解答可以来此QQ群交流:58074 ...
- Picker 组件的设计与实现
前言 今天的主题是 Picker 组件的设计与实现,Picker 组件是 NutUI 的一个拾取器组件,它用于显示一系列的值集合,用户可以滚动选择集合中一项,也可以支持多个系列的值集合供用户分别选择. ...
- 蒲公英 · JELLY技术周刊 Vol.20: Vue3 极致优化——分析 Vue3 Compiler 告诉你为什么这么快
蒲公英 · JELLY技术周刊 Vol.20 性能优化是一条无尽的路,我们总是可以找到各种途径去提升体验,不论是响应时间还是按需加载,亦或是根据框架或者组件有针对性的优化都会是不错的方法.如果你在使用 ...
- Python 爬虫+tkinter界面 实现历史天气查询
文章目录 一.实现效果 1. python代码 2. 运行效果 二.基本思路 1. 爬虫部分 2. tkinter界面 一.实现效果 很多人学习python,不知道从何学起.很多人学习python,掌 ...
- Android开发必有功能,更新版本提示,检测是否有新版本更新。下载完成后进行安装。
作者:程序员小冰,CSDN博客:http://blog.csdn.net/qq_21376985,转载请说明出处. 给大家介绍个东西,MarkDown真的超级超级好用.哈哈.好了, 正题内容如下: 先 ...
- Android开发之获取APP的应用程序名称以及版本名称信息java工具类
//跟App相关的辅助类 public class AppUtils { private AppUtils() { /* cannot be instantiated */ throw new Uns ...
- Linux下命令设置别名--alias(同实用于mac)
最近在搞appium自动化脚本编写,过程中经常会使用 uiautomatorviewer这个工具查看UI布局和元素,但是不得不说这个单词太长了.. 如何快速使用,有三个小技巧,分别是: 1.设置好改工 ...
- okhttp3 示例
1.GET请求 private fun httpGetDemo() { //1.请求参数 val url = httpHost + "/api/test?arg1=xxx" //2 ...
- Black & White(尺取)
链接:https://ac.nowcoder.com/acm/contest/893/F来源:牛客网 * 第一行一个整数 T ,表示接下来有 T 个样例.* 首先输入n,m,表示S串的长度n和操作次数 ...