【class2】两个小练习

题目   有四个数字: 1、2、3、4,能组成多少个互不相同且无重复数字的三位数?各是多少? 程序分析          遍历全部可能,把有重复的剃掉。

示例:
total=0
for i in range(1,5):
     for j in range(1,5):
           for k in range(1,5):
                if (i!=j and j!=k and i!=k):
                    print(i,j,k)
                    total+=1
print("please  output:",total)

简便方法    用  itertools 中 的  permutations 即可。

import itertools

sum2=0

a=[1,2,3,4]

for i in itertools.permutations(a,3):

    print(i)

    sum2+=1

print(sum2)

补充知识:

`itertools.permutations` 函数用于生成输入可迭代对象的所有可能的排列组合。每个排列组合都是元组形式,包含所有元素但顺序不同。这个函数在排列组合问题、组合数学或者当你需要遍历一个集合的所有可能顺序时非常有用。

下面是一个简单的例子,演示了如何使用 `itertools.permutations`:

```python
import itertools

# 定义一个列表
my_list = [1, 2, 3]

# 使用 itertools.permutations 生成所有可能的排列
permutations = itertools.permutations(my_list)

# 打印所有排列
for perm in permutations:
    print(perm)
```

输出将是:
```
(1, 2, 3)
(1, 3, 2)
(2, 1, 3)
(2, 3, 1)
(3, 1, 2)
(3, 2, 1)
```

`itertools.permutations` 还有一个可选参数 `r`,用于指定每个排列中元素的数量。如果省略 `r`,则默认为输入列表的长度,即生成所有元素的排列。如果指定了 `r`,则生成的排列将只包含 `r` 个元素。

例如,如果你只想生成包含两个元素的排列:

```python
permutations_of_two = itertools.permutations(my_list, 2)

for perm in permutations_of_two:
    print(perm)
```

输出将是:
```
(1, 2)
(1, 3)
(2, 1)
(2, 3)
(3, 1)
(3, 2)
```

这种方式使得 `itertools.permutations` 非常灵活,适用于各种排列组合问题。

题目   企业发放的奖金根据利润提成。利润  (I)低于或等于 10 万元时,奖金可10%;利润高于 10 万元, 低于  20 万元时, 低于  10 万元的部分按   10%提成, 高于  10 万元的部分,  可提成7.5%;20 万到  40 万之间时,高于 20 万元的部分,可提成  5%;40 万到  60 万之间时高于 40万元的部分,可提成     3%;60 万到  100 万之间时,高于  60 万元的部分,可提成 1.5%,高于100 万元时,超过 100 万元的部分按   1%提成,从键盘输入当月利润  I,求应发放奖金总数? 程序分析                  分区间计算即可。

示例:

profit = int(input('Show me the money: '))  # 假设这是正确的输入行
bonus = 0
thresholds = [100000, 100000, 200000, 200000, 400000]
rates = [0.1, 0.075, 0.05, 0.03, 0.015, 0.01]

for i in range(len(thresholds)):
    if profit <= thresholds[i]:
        bonus += profit * rates[i]
        profit = 0
        break
    else:
        bonus += thresholds[i] * rates[i]
        profit -= thresholds[i]

# 这部分处理最后一个阈值之外的任何剩余利润。
if profit > 0:
    bonus += profit * rates[-1]

print(bonus)
 

解释代码:

此代码的核心逻辑是基于利润水平来计算奖金,它通过一系列预定义的阈值(thresholds)和对应的费率(rates)来实现。这个计算过程考虑了利润可能跨越多个费率区间的情况,并为每个区间的利润部分按照相应的费率计算奖金。具体逻辑如下:

1. **利润输入**:
   首先,从用户那里获取一个整数类型的利润值。这是计算的基础。

2. **初始化变量**:
   - `bonus`变量初始化为0,用于累加计算出的奖金总额。
   - `thresholds`和`rates`是两个列表,分别存储了不同的利润阈值和对应的奖金费率。

3. **遍历阈值**:
   使用一个`for`循环遍历`thresholds`列表。在每一轮循环中,执行以下判断和计算:
   - 如果当前利润小于或等于正在处理的阈值,那么按照当前阈值对应的费率计算奖金,然后将利润设为0(表示所有利润都已处理完毕),并退出循环。
   - 如果当前利润大于正在处理的阈值,则先按照该阈值的费率计算该阈值部分的奖金,并从总利润中减去该阈值金额,继续循环处理下一个阈值。

4. **处理超出最高阈值的利润**:
   `for`循环结束后,如果还有剩余的利润(即利润超过了所有定义的阈值),则使用`rates`列表中的最后一个费率(针对超出最高阈值部分的利润)来计算奖金,并加到`bonus`中。

5. **输出结果**:
   最后,打印出计算得到的总奖金。

通过这种方式,代码能够灵活地处理不同的利润区间,并根据每个区间的特定费率计算相应的奖金。这种计算模式在多档次利润分配或税率计算中很常见,能够确保每一部分利润都按照相应的费率被合理地计算奖金。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值