目录:
题目描述
做题过程
他人的想法
综合感悟
1.题目描述:
一共有多少种方式使 n 表示为若干个连续正整数的和,要求至少包括两个正整数。如 n=15 时,可以有 3 种方式:( 1+2+3+4+5 ),( 4+5+6 ),( 7+8 )
样例输入
2 |
样例输出
Case #1: 1
Case #2: 3
2.做题过程
这道题,一开始我想到了等差数列求和的原理。我想从n由两个连续数想加,三个连续数相加,四个连续数相加...判断每次是否都有这个整数,该整数就是首项,首项是整数就说明存在。
一开始我想最多应该不少于n-1项?所以把循环截止在n-1,但是复杂度可想而知。。
后来想想,不可能有n-1的循环,之后利用等差数列的求和公式,找到了n的范围是根号(2*n)。有效降低复杂度。
另外:因为i<根号(2a)所以这里的 d=(2*a-i*i+i)>0。
源码:
import math zs = int(input()) c = [] for i in range(zs): a = int(input()) x = 0 for i in range(2,math.ceil(pow (2*a,0.5))): # 在这里利用等差数列求和的等式,放大缩小,确立不等式,找到的循环的范围 d = (2*a-i*i+i) e = (i*2) if not d%e and d>0: # 如何判断除法之后的数还是整数,?3.0 x+= 1 c.append(x) for i,ii in enumerate(c): print("Case #%d:"%(i+1),ii)
3.他人的想法
如出一辙
4.综合感悟
程序题涉及到基本的数学知识,我们要善于联系,也要充分利用。把握编程实现的乐趣。