Python课程|上机小任务1.1-数字统计练习

数字统计练习

基本要求:

●以列表形式输入一组数字(整数),统计其中的正数个数、负数个数、零个数、奇数个数(正负总共的)、偶数个数(正负总共的,也包括零),并打印这些统计结果;

高级要求:

●在上述输入的一组数字中,以加‘+’和减‘-’进行组合运算,找出所得运算结果中绝对值最小的一种组合方式,并将这组数字连同加减运算符号、以及加减运算结果一同打印出来。

        例如,输入列表 [2, -3, 5, 6],  使这些数绝对值最小的一个组合方式是:+,-,+, 组合结果是:0,则程序将打印出:  2 + -3 – 5 + 6 = 0         

import itertools
# 数字统计的函数


def number_count(user_input):
    # 统计正数
    positive_num = 0
    # 统计负数
    negative_num = 0
    # 统计零的个数
    zero_num = 0
    # 奇数个数
    odd_num = 0
    # 偶数个数
    even_num = 0
    for i in user_input:
        if i > 0:
            positive_num = positive_num + 1
        if i < 0:
            negative_num = negative_num + 1
        if i == 0:
            zero_num = zero_num + 1
        if i % 2 == 0:
            even_num = even_num + 1
        if i % 2 != 0:
            odd_num = odd_num + 1

    print("正数的个数是{},负数的个数是{},零的个数是{},奇数的个数是{},偶数的个数是{}.".format(
        positive_num, negative_num, zero_num, odd_num, even_num))
    return True


def calc(user_input):
    # 列表长度
    list_len = len(user_input)

    # 计算正负号的长度
    symbol_len = list_len - 1

    # 列出正负号的所有可能性
    flag = 0
    result_list = []
    j = 0
    i_flag = 0
    flag_dic = {}
    # xxx = itertools.product('+-', repeat=symbol_len)
    for i in itertools.product('+-', repeat=symbol_len):
        # print(i)
        flag_dic[i_flag] = i
        i_flag = i_flag + 1
        # for k in i:
        # for j in range(len(user_input)):
        for k in i:
            if j == (len(user_input) - 1):
                break
            if (k == '+') & (j == 0):
                flag = user_input[j] + user_input[j + 1]
            if (k == '-') & (j == 0):
                flag = user_input[j] - user_input[j + 1]
            if (k == '+') & (j != 0):
                flag = flag + user_input[j + 1]
            if (k == '-') & (j != 0):
                flag = flag - user_input[j + 1]
            j = j + 1
        result_list.append(flag)
        flag = 0
        j = 0

        # result_list.append(flag)

    # print(flag)
    # print(result_list)
    # print(flag_dic)
    for x in range(len(result_list)):
        result_list[x] = abs(result_list[x])
    print("绝对值最小的组合结果是{}".format(min(result_list)))

    # 用来存储最小绝对值的下标
    flag2 = 0
    for x in range(len(result_list)):
        if result_list[x] == min(result_list):
            flag2 = x
    for q in flag_dic.keys():
        if q == flag2:
            stry = ''
            flag3 = 0
            for t in range(len(user_input)):
                if t == len(user_input) - 1:
                    stry = stry + ' ' + str(user_input[t])
                else:
                    stry = stry + ' ' + str(user_input[t]) + ' ' + str(flag_dic[q][flag3])
                    flag3 = flag3 + 1

            stry = stry + ' = ' + str(min(result_list))
            print("运算公式可以表示为:{}".format(stry))
    # print("运算公式可以表示为:{}".format())
    return True


if __name__ == "__main__":
    user_input = eval('[' + input("请输入一组数字以逗号隔开:") + ']')

    number_count(user_input)
    calc(user_input)

课程上机任务小练习

如有不足 多多指教

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值