用python判断构成三角形

编写类,寻找最大周长的三角形。要求输入一个正整数列表,返回由列表中的三个数值组成的有效三角形的最大周长。如果所有的数值组合都不能构成有效三角形,则返回 0。输入输出示例及效果如下图:【参考代码行数:27行】
提示:(1)能构成三角形的条件为,任意两边之和大于第三边,任意两边之差的绝对值小于第三边;
(2)获取固定位数数字排列组合方法,如下面是获取3位数字排列组合的用法。
from itertools import combinations, permutations
print(list(permutations([1, 2, 3,4], 3))) # 有序排列
print(list(combinations([1, 2, 3,4], 3))) # 无序排列
代码参考:

img

运行预览:

img

img

from itertools import combinations, permutations


class Summ():
    def __init__(self, alist):
        self.alist = alist

    def get_ret(self):
        is_true = False
        ret_dic = {}
        for num in list(permutations(self.alist, 3)):
            if num[0] + num[1] > num[2] and abs(num[0] - num[1]) < num[2]:
                ret_dic[sum(num)] = num
                is_true = True
        if not is_true:
            print('所以组合都不能构成有效三角形')
        else:
            ret_dic = sorted(ret_dic.items(), key=lambda x:x[0])
            print(f'最大周长为:{ret_dic[0][0]};三边长度分别为:{ret_dic[0][1][0]}{ret_dic[0][1][1]}{ret_dic[0][1][2]}')


if __name__ == '__main__':
    numlist = input('输入列表:').split()
    numlist = [int(temp) for temp in numlist]
    summ = Summ(numlist)
    ret = summ.get_ret()
    # print(f'{ret} -> numlist[{ret[0]}]+numlist[{ret[1]}]={target}')

这题根本不需要排列,用排列还要再考虑周长大小问题,反而麻烦
1.先把输入存进list里,n=list(eval(input().replace(' ',',')))
2.按从大到小排序,n.sort(reverse=True)
3.循环for i in renge(n-2)
每次取i,i+1,i+2三个判断是否能构成三角形,只要能构成,那肯定是最大的三角形
4.既然已经排序过了,判断的时候判断n[i]>n[i+1]+n[i+2]即可,不需要排列组合


# -*- coding: utf-8 -*-


from itertools import combinations, permutations


class judge_triangle:
    def __init__(self, alist):
        self.alist = alist
        self.max_length = 0
        self.tmp = []


    def is_triangle(self, list1):
        a, b ,c = list1
        if (a+b>c) and (a+c>b) and (b+c>a):
            return True
        else:
            return False

    def all_combinations(self, list1):
        # 返回所有3个数组合
        return list(combinations(list1, 3))

    def cal_perimeter(self, list1):
        # 计算周长
        return sum(list1)

    def return_max(self, list1):
        # 返回最大周长
        for each in self.all_combinations(list1):
            if self.is_triangle(each):
                perimeter = self.cal_perimeter(each)
                if perimeter >= self.max_length:
                    self.max_length = perimeter
                    self.tmp.append(each)
        return self.max_length, self.tmp

    def main(self):
        perimeter, comb = self.return_max(self.alist)
        if perimeter == 0:
            print('所有组合都不能构成有效三角形')
        else:
            print("最大周长为: {};三边长度分别为: {}".format(perimeter, comb))

a = judge_triangle([6,7,10,20,32,1])
a.main()

a = judge_triangle([1,2,7])
a.main()

img

from itertools import permutations, combinations


def check_ok(all_sanbian):
    result = True
    # 能构成三角形的条件为,任意两边之和大于第三边,任意两边之差的绝对值小于第三边
    for i in list(permutations(all_sanbian, 3)):
        if not (i[0] + i[1] > i[2] and abs(i[0] - i[1]) < i[2]):
            result = False
            break
    return result


class SanJiaoXing:
    def __init__(self, alist):
        self.alist = alist

    def get_max(self):
        result = None
        data = None
        for i in list(combinations(self.alist, 3)):
            if check_ok(i):
                temp = sum(i)
                if result is None or temp > result:
                    result = temp
                    data = i
        return result, data


if __name__ == '__main__':
    alist = input('输入整数列表:').split()
    # alist = '6 7 10 20 32 1'.split()
    # alist = '1 4 7'.split()
    alist = [int(temp) for temp in alist]
    get_max = SanJiaoXing(alist).get_max()
    if get_max[0] is None:
        print('所有组合都不能构成有效三角形')
    else:
        print(f'最大周长为:{get_max[0]} 三边长度分别为:{get_max[1][0]}{get_max[1][1]}{get_max[1][2]}')


from itertools import combinations
userInput = input('输入一组以空格隔开的正整数列表:')  # 6 7 10 20 32 1 14
info = [ int(i) for i in userInput.split() ]   #  [6, 7, 10, 20, 32, 1, 14]
result = {  }
for item in list( combinations( info,3 ) ):
    if ( item[0] + item[1] > item[2] ) and ( abs(item[0] - item[1]) < item[2] ):
        sum = item[0] + item[1] + item[2]
        if sum not in result.keys():
            result[sum] = [ item ]
        else:
            result[sum].append(item)

max_perimeter = max( result.keys() )
data = result.get( max( result.keys() ) )
if len(data) == 1:
    print('最大周长为:{},三边长分别为:{}'.format(  max_perimeter,  '、'.join( list( map( lambda x:str(x),data[0] ) ) )     ))
else:
    for i in data:
        print('最大周长为:{},三边长分别为:{}'.format(max_perimeter,   '、'.join( list( map( lambda x:str(x),i ) ) )   ))

img


from itertools import combinations

import math


# print(list(permutations([1, 2, 3, 4], 3)))  # 有序排列
# print(list(combinations([1, 2, 3, 4], 3)))  # 无序排列


class Triangle(object):
    alist = None

    def __init__(self, alist):
        self.alist = alist

    def largestTriangle(self):
        res = []
        self.alist.sort()
        # 对边长升序排序进行无序组合,因此最后一组能构成三角形的值,周长一定是最大的
        for val in combinations(self.alist, 3):
            # class tuple转list
            l = [x for x in val]
            # 判断是否能构成三角形
            if (l[0] + l[1] > l[2] and l[0] + l[2] > l[1] and l[1] + l[2] > l[0]
                    and math.fabs(l[0] - l[1]) < l[2] and math.fabs(l[0] - l[2]) < l[1] and math.fabs(l[1] - l[2]) < l[
                        0]):
                res.append([sum(l), l])
        return res


# list = [6, 7, 10, 20, 32, 1]
# list = [1, 4, 7]
list = list(map(int, input("输入列表:").split()))
val = Triangle(list)
res = val.largestTriangle()
if (len(res) == 0):
    print("所有组合都不能构成有效三角形")
else:
    print("最大周长:%d,三边长度分别为:%d、%d、%d" % (res[-1][0], res[-1][1][0], res[-1][1][1], res[-1][1][2]))