数的拆分,python实现蓝桥杯2022年第十三届省赛真题

  python3.8,jupyter notebook运行结果:

 

详细思路在代码中,主要思路为:

一,#情况这样考虑:如有8、72这两个数,则考虑 2^3 * 1^2,8*9 = 2*2*2*3*3
#如99,约数有3、3、11,保存在mm中得mm = [3,3,11],然后有个列表kk = [3,11],具体操作kk=list(set(mm))
#则说明mm.count[kk[0]] = mm.count[3]= 2,mm.count[kk[1]] = mm.count[11] = 1,
#此时只需要判断是否有两个不同的约数,或只有一个约数,且每个约数个数大于1

二,#这里种类为2和1都行,如8=2*2*2,其约数种类是1即只有2,但其显然可以2*2*2*1*1,
#种类为2的情况是,72=2*2*2*3*3,显然也可以

#按照样例输入
# 样例输入
# 7
# 2
# 6
# 12
# 4
# 8
# 24
# 72

# 输出
# no
# no
# no
# yes
# yes
# no
# yes
n = int(input())
ll = []
for i in range(n):
    ll.append(int(input()))


#情况这样考虑:如有8、72这两个数,则考虑 2^3 * 1^2,8*9 = 2*2*2*3*3
#如99,约数有3、3、11,保存在mm中得mm = [3,3,11],然后有个列表kk = [3,11],具体操作kk=list(set(mm))
#则说明mm.count[kk[0]] = mm.count[3]= 2,mm.count[kk[1]] = mm.count[11] = 1,
#此时只需要判断是否有两个不同的约数,或只有一个约数,且每个约数个数大于1,就行了
#这里种类为2和1都行,如8=2*2*2,其约数种类是1即只有2,但其显然可以2*2*2*1*1,
#种类为2的情况是,72=2*2*2*3*3,显然也可以

mm = []#用以保存每次数的所有约数,如72拆成,2,2,2,3,3,保存为mm = [2,2,2,3,3]
#类似于声明一下后面的拆分函数
def foo(x):
    Divisor(x)#拆分函数

#主函数
if __name__ =="__main__":
    #开始调用处理输入的每一个值
    for x in ll:
        mm = []#初始化,用来装x的约数,foo函数会使用
        foo(x)#拆x的约数
        
        kk = list(set(mm))#用set集合,去除一次重复元素并转化成list给kk,用作查找数,因为我们需要找到某数的重复的次数
        #开始查找,并统计每个约数个数都大于1,这里种类为2和1都行,如8=2*2*2,其约数种类是1即只有2,但其显然可以2*2*2*1*1,
        #种类为两种的情况是,72=2*2*2*3*3,显然也可以
        #print(mm)
        flag = 0#flag是标识一下'no',和'yes',1表示输出了no,0表示要输出yes
        for j in range(len(kk)):
            #print(mm.count(kk[j]))
            if mm.count(kk[j]) < 2:#说明有小于2的个数,不可能成立
                print('no')
                flag = 1
                break
        if flag == 0:#flag = 0说明没有输出'no',是正常结束的,即所有约数个数都大于1,或者满足上文的两类情况
            print('yes')
            

#拆分出最小的公约数元素,如72拆成,2,2,2,3,3。又如8,拆成2*2*2,显然两个都满足
def Divisor(x):
    
    j = 1#j是遍历值,这里声明为全局,为了后面对比
    for j in range(2,int(x/2)+1):
        if x % j == 0:#如果x如,72%2 == 0,36%2 == 0,18 % 2,== 0,9%3 == 0,然后发现3进不了循环处理最后一位
            #print(x,j,x/j)
            mm.append(j)
            break
    if j == 1:#继续上文样例,发现3进不了循环要处理这最后一位,即j不会变化依然为1说明是最后一项,也可以说这是个质数不能继续约分了
        #print(x)
        mm.append(x)#最后一位入列表
    else:#继续找最小约数,如72/2 = 36,36可以继续找约数,36/2=18,go on,18/2=9,go on,9/3 = 3
        Divisor(int(x/j))
    return
# 样例输入
# 7
# 2
# 6
# 12
# 4
# 8
# 24
# 72

# 输出
# no
# no
# no
# yes
# yes
# no
# yes

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值