2021-04-24

python-PTA刷题

在这里插入图片描述
这周解决了之前做错的两个题之后PTA上的python就全部刷完啦

3-2 验证身份
题目:
一个合法的身份证号码由17位地区、日期编号和顺序编号加1位校验码组成。校验码的计算规则如下:
首先对前17位数字加权求和,权重分配为:{7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};然后将计算的和对11取模得到值Z;最后按照以下关系对应Z值与校验码M的值:

Z:0 1 2 3 4 5 6 7 8 9 10M:1 0 X 9 8 7 6 5 4 3 2
现在给定一些身份证号码,请你验证校验码的有效性,并输出有问题的号码。

思路:之前没有解决这个题 现在重新做 一开始老是答案错误 后来逐个打印纠错才发现权重就是给的那么多数字 不是需要让他们之和等于1 (初中思维吗这是)当初也没想到要是让权重之和等于1的话除以11的余数不都是这个数本身吗…当时没想到 甚至因为想到可能有小数 还细心地发现了sum 应该= 0.0 不过根本就不是小数啦
后来解决了这个问题 但是测试点1会报错 找问题找了半天
就换了种方式写 就正确了:

n = int(input())
id_list = []
weight = [7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2]
M_list = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2']
num = 0
for i in range(n):
    id_list.append(input())
for i in id_list:
    if i[0:17].isdigit():
    # 如果前17位全是数字
        sum1 = 0
        for k in range(17):
            sum1 += int(i[k]) * weight[k]
        #print(sum1)
        z = sum1 % 11
        if i[-1] != M_list[z]:
            #print(z)
            print(i)
            num += 1
    else:
        print(i)
        num += 1
if num == 0:
    print('All passed')

做出来之后发现也没有那么难嘛( ̄▽ ̄)"
但是还是不知道之前这样写为啥测试点1会是答案错误:

n = int(input())
id_list = []
weight = [7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2]
# z_list = ['0','1','2','3','4','5','6','7','8','9','10']
M_list = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2']
num = 0
for i in range(n):
    id_list.append(input())
for i in id_list:
    for j in i[:17]:
        if j.isalpha():
            print(i)
            num += 1
            id_list.remove(i)
for i in id_list:
    sum1 = 0.0
    for j in range(17):
        sum1 += float(int(i[j]) * weight[j])
    #print(sum1)
    z = int(sum1) % 11

    if i[17] != M_list[z]:
        #print(z)
        print(i)
        num += 1
if num == 0:
    print('All passed')

4-21 判断上三角矩阵
题目:
上三角矩阵指主对角线以下的元素都为0的矩阵;主对角线为从矩阵的左上角至右下角的连线。
本题要求编写程序,判断一个给定的方阵是否上三角矩阵。输入格式:
输入第一行给出一个正整数T,为待测矩阵的个数。接下来给出T个矩阵的信息:每个矩阵信息的第一行给出一个不超过10的正整数n。随后n行,每行给出n个整数,其间以空格分隔。输出格式:
每个矩阵的判断结果占一行。如果输入的矩阵是上三角矩阵,输出“YES”,否则输出“NO”。

之前做错的原因在于找下三角下标的循环部分写错:
(虽然不知道之前做的时候为什么一直找不出来错在哪儿)

for j in range(n-1):        
	for content in range((j+1) * n, (j+1) * n + j):

改正后:

num_matrix = int(input())
n1 = 0
#矩阵的个数
while True:
    n1 += 1
    n = int(input())
    #矩阵的秩
    list1 = list(map(int, input().split()))
    while len(list1) < n * n:
        list2 = list(map(int, input().split()))
        list1.extend(list2)
        list2.clear()
    num0 = 0
    #num0表示下三角中0的数量
    for j in range(1,n):
        #print(j)
        for content in range(j * n, j * n + j):
            # 可以找出规律下三角的数下标为(j * n, j * n + j) 如4行矩阵位于下三角的数的下标:4,8,9,12,13,14
            #print(content)
            if list1[content] != 0:
                num0 += 1
    if num0 == 0:
        print('YES')
    else:
        print('NO')
    list1.clear()
    if n1 >= num_matrix:
        break
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值