信用卡号是否合法的判断规则为: a) 对给定的8位信用卡号码,如43589795,从最右边数字开始,隔一位取一个数相加,如5+7+8+3=23。 b) 将卡号中未出现在第一步中的每个数字乘2,然后将相乘的结果的每位数字相加。例如,对上述例子,未出现在第一步中的数字乘2后分别为(从右至左)18、18、10、8,则将所有数字相加为1+8+1+8+1+0+8=27。 c) 将上述两步得到的数字相加,如果得数个位为0,则输入的信用卡号是有效的。 请在指定位置完成函数的编写,判断用户输入的8位信用卡号码是否合法。
时间: 2023-06-11 20:07:13 浏览: 72
可以按照题目要求,分别实现两个函数来完成这个任务:
第一个函数 `step1(card_num: str) -> int`,用来实现第一步的逻辑,即隔一位取一个数相加:
```python
def step1(card_num: str) -> int:
sum = 0
for i in range(len(card_num)-1, -1, -2):
sum += int(card_num[i])
return sum
```
第二个函数 `step2(card_num: str) -> int`,用来实现第二步的逻辑,即将卡号中未出现在第一步中的每个数字乘2,然后将相乘的结果的每位数字相加:
```python
def step2(card_num: str) -> int:
sum = 0
for i in range(len(card_num)-2, -1, -2):
double = int(card_num[i]) * 2
if double > 9:
sum += double // 10 + double % 10
else:
sum += double
return sum
```
最后,我们可以将这两步的结果相加,判断是否整除10:
```python
def is_valid_card_num(card_num: str) -> bool:
sum = step1(card_num) + step2(card_num)
return sum % 10 == 0
```
完整代码如下:
```python
def step1(card_num: str) -> int:
sum = 0
for i in range(len(card_num)-1, -1, -2):
sum += int(card_num[i])
return sum
def step2(card_num: str) -> int:
sum = 0
for i in range(len(card_num)-2, -1, -2):
double = int(card_num[i]) * 2
if double > 9:
sum += double // 10 + double % 10
else:
sum += double
return sum
def is_valid_card_num(card_num: str) -> bool:
sum = step1(card_num) + step2(card_num)
return sum % 10 == 0
# 测试样例
print(is_valid_card_num('43589795')) # True
```