有趣的数学问题之-用数列方法解决数的分解问题。

一、概述

前面一篇有提过等差数列在递归问题中的一些运用,接下来将介绍两道小栗子(也是通过等差数列来进行求解的题目),这两道题呢,是我之前偶尔遇见碰到,发现可以通过等差数列的方法来解决枚举问题,那么话不多说,请观众老爷请看栗子。

二、两道小栗子

1.例题1

题目如下所示,用连续的自然数来表示任一个整数,且要列出有几种表达式,并按顺序打印出来。

华为OD机试真题-用连续自然数之和来表达整数-2023年OD统一考试(C卷)_华为od用连续的自然数之和表达整数-CSDN博客

乍一看,任意给出一个数,列举出所有表达式有点难度,但仔细想想,通过给出的栗子,能发现什么呢?哎,别急,请看下表,大伙就知道了。相信大伙看了表之后,就会发现,任一给定Sn,在d=1,可以分解成有限个an之和。

等差数列(d=1)
Sn999121210181818
a1942123101853
n123131134

而题目让我们给出所有等式成立的表达式,我们先通过等差数列求和公式作为约束条件,让计算机迭代查找所有符合条件的(a1,n)的例子,将其存储在列表中,在通过项数进行排序,再利用相关的字符串操作,将结果打印出来。那么关键思路就是通过给定等差数列约束条件,然后交给计算机进行查找了,以下是py代码。

while True:
    try:
        Sn = int(input())
        if Sn <= 2:
            print(f"{Sn}={Sn}")
            print("Result:1")
        else:
            ls1 = [] #先创建一个表格用来存放符合条件的等差数列
            print(f"{Sn}={Sn}")
            for a1 in range(1,Sn):
                for n in range(1,Sn):
                    if n*a1+(n-1)*n/2 == Sn: #约束条件
                        ls1.append([a1,n])
            ls1 = sorted(ls1, key=lambda x: x[1]) #根据项数升序
            #ls1 = sorted(ls1, key=lambda x: x[0],reverse=True) #根据首项来降序
            for s in ls1:
                l = [x for x in range(s[0], s[0] + (s[1] - 1) * 1 + 1)] #a1-an
                print(f"{Sn}=" + "+".join(map(str, l)))
            print(f"Result:{len(ls1)+1}")
    except:
        break

2.例题2

如果说你能解答出上一题,那么下一道题也难不住大家,也是同样的思路,题目如下所示:

华为OD机试真题-数的分解-2023年OD统一考试(C卷)_华为机考:给定一个正整数n,如果可以分解为m个连续正整数之和-CSDN博客

同样是用m个连续自然数表示任一给定的正整数N,只不过只需要给出项数最少(2项以上的)的那一个表达式即可。显然,对于任一大于2的正奇数,m恒为2(这两项在n/2的两侧),偶数的m值如果存在一定m>=3(因为不能是相同的两数相加)。

解决思路同上,通过给定求和公式,约定计算机,使其进行迭代寻找满足分解的a1和n,将其存储并排序(或者不用排序,直接获取即可)。

下面是Python代码。

while True:
    try:
        Sn = int(input())
        if Sn % 2 == 0: #对偶数进行分解
            result, l = 0, [] #创建列表进行存储
            for n in range(3, Sn): #迭代枚举
                for a1 in range(1, Sn): 
                    if n * a1 + (n - 1) * n / 2 == Sn: #条件约束
                        result = 1
                        l.append([a1, n]) 
            if result == 1: #如果分解存在
                l = sorted(l, key=lambda x: x[1]) #根据项数进行排序
                a1,n = l[0][0],l[0][1] #获取列表第一项(m最小)
                ls = [a1+(n-1) for n in range(1,n+1)] #a1-an
                print(f"{Sn}=" + "+".join(map(str,ls))) #打印输出
            else:
                print("N")
        else:
            print(f"{Sn}={Sn // 2}+{Sn // 2 + 1}") #奇数直接求解,并打印即可
    except:
        break

三、总结

好了,本篇通过引入等差数列求和公式的思路,帮助我们去约束计算机,让它去寻找符合题解的答案,通过学习本篇的等差数列可以去解决通用的数的分解等相似问题。如果本篇对你有所帮助的话,请各位观众姥爷点赞收藏支持一下呀,如果可以关注一波就再好不过了,你们的支持和鼓励是我更博的最大助力呢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值