贝壳2021算法,数列删除数字变成最大公约数为1

题目:我们定义任意一个序列的最大公约数为最大的能整除序列中所有数的数,例如[2,2,4]的最大公约数为2,[1,2,4]的最大公约数为1,现在想对于一个长度为N的序列,如果最多能删除N-1个数,请问他需要至少删除多少个数可以让序列的最大公约数为1,或者不可能,不可能输出-1。
输入:
2#数据组数
3#每组数据中序列的长度
2 2 4#序列内的数
2
1 2
输出:
-1
0

思路:将数列的第一个数作为数列其他数的除数,只要能整除就把后面的数都删了,再到数列剩下数的第二个作为数列其他数的除数,整除的再删,只到遍历到最后一个数。如果剩下多个数,删的数的个数就是最后结果,如果只能一个数则不能实现输出-1。同时只要1在数列中,一定不用处理最大公约数就是1。
代码:

n = int(input())
for i2 in range(n):
    n2 = int(input())
    list1 = list(map(int,input().split()))
    if 1 in list1:
        print(0)
    else:
        list2 = sorted(list1)
        i = 0
        list3 = []
        while i<len(list2)-1:
            for j in reversed(range(len(list2))):
                a = list2[i]
                if list2[j]%a==0:
                    list3.append(list2[j])
                    list2.remove(list2[j])
            list2.insert(i,a)
            i = i + 1
            list3.remove(a)
        if len(list2) <=1:
            print(-1)
        else:
            print(len(list3))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值