题目描述: 一个整数可以由连续的自然数之和来表示。给定一个整数,计算该整数有几种连续自然数之和的表达式,且打印出每种表达式。 输入描述: 一个目标整数T(1<=T<=1000)输出描述: 该整数的所有表达式和表达式的个数。 如果有多种表达式,输出要求为: 1.自然数个数最少的表达式优先输出 2.每个表达式中按自然数递增的顺序输出,具体的格式参见样例。在每个测试数据结束时,输出一行“ResultX”,其中X是最终的表达式个数。 示例1 输入: 9 输出: 9=9 9=4+5 9=2+3+4 Result: 3 说明: 整数9有三种表示方法, 第1个表达式只有1个自然数,最先输出, 第2个表达式有2个自然数,第2次序输出, 第3个表达式有3个自然数,最后输出。 每个表达式中的自然数都是按递增次序输出的。 数字与符号之间无空格 示例2 输入: 10 输出: 10=10 10=1+2+3+4 Result: 2
解题思路:
1、枚举所有可能的起始数字:从1开始,枚举可能的连续自然数序列的起始数字 start。
2、累加检查:对于每一个起始数字 start,逐个累加下一个自然数,直到累加和等于给定的目标整数 T,或者累加和大于 T。
3、输出格式:当累加和等于 T 时,将该序列记录为一个有效表达式,并将其格式化输出。 4、计数:统计并输出有效表达式的数量。
代码部分
def find_expressions(T):
count = 0
result = []
for start in range(1, T + 1):
total = 0
expression = []
for num in range(start, T + 1):
total += num
expression.append(num) #连续自然数,故将每个数都加入expression
if total == T: #和等于T,找到一个表达式
result.append(expression)
count += 1
break
elif total > T: #和大于T,直接退出
break
#else:和小于T,继续执行循环,+后一位整数
#输出所有符合条件的表达式
for exp in result[::-1]:
print('{}='.format(T) + '+'.join(map(str, exp)))
#输出表达式总数
print('Result:{}'.format(count))
T = int(input())
find_expressions(T)
其他思路:
使用“滑动窗口”:
1、维护一个sum = T的连续正整数窗口,从T开始向下遍历。
2、sum > T,移除窗口左边值,右边加入新值
3、sum < T,窗口右侧继续加入新值
代码部分
from collections import deque
def find_expression_1(T):
window = deque()
result = []
count = 0
for x in range(T, 0, -1):
window.append(x)
tmp_sum = sum(window)
if tmp_sum < T: # 继续添加
continue
elif tmp_sum > T: # 先移除最大元素
window.popleft()
continue
else: # 得到一个表达式
tmp_res = [] # 临时存储表达式中的整数
while window: # 重新寻找窗口
tmp_res.append(window.popleft())
result.append(tmp_res)
count += 1
for exp in result:
print('{}='.format(T) + '+'.join(map(str, exp)))
#输出表达式总数
print('Result:{}'.format(count))
知识点:列表,滑动窗口
结语:越简单的题目解法应该越多,请路过大神留下新的思路供本小白学习一下,打开思路