10届省赛java试题 D: 数的分解

数的分解


【问题描述】 把 2019 分解成 3 个各不相同的正整数之和,并且要求每个正整数都不包 含数字 2 和 4,一共有多少种不同的分解方法? 注意交换 3 个整数的顺序被视为同一种方法,例如 1000+1001+18 和 1001+1000+18 被视为同一种。
方法一
思路:
第一种方法我用的是递归的思路我们先把满足题目条件的存到一个列表中,然后用递归的思想遍历2层然后2019-s就是我选了前2个数后面的一个是就用判断来看看符不符合题目条件,题目说了不重复我们就从小到大的顺序依次排列就可以避免不重复了,题目的k参数就是用了管重复可能的。
程序:

a=[]
for i in range(1,2020):
    if str(i).count("2")==0 and str(i).count("4")==0:
        a.append(i)
con=0
def dfs(m,s,k):
    global con

    if m==2 :
        if a.count(2019-s)==1 and  2019-s>=a[k]:
            con+=1

        return

    for i in range(k,len(a)):
        if s+a[i]>2019 or i+1>=len(a):
            break
        dfs(m+1,s+a[i],i+1)

dfs(0,0,0)

方法二
思路:
这种方法就是用for语句来遍历的。
程序:

a=[]
for i in range(1,2020):
    if str(i).count("2")==0 and str(i).count("4")==0:
        a.append(i)
con=0
for i in range(len(a)):
    for i1 in range(i+1,len(a)):
        if i1+1>=len(a):
            break
        if 2019-(a[i]+a[i1])>=a[i1+1] and a.count(2019-(a[i]+a[i1]))==1:
                con+=1
print(con)

禁止转载。仅用于自己学习。对程序错误不负责。

猜你喜欢

转载自blog.csdn.net/weixin_46640345/article/details/112958889