How to calculate smallest number with certain number of divisors?

前端 未结 9 1404
野性不改
野性不改 2020-12-29 07:51

From Project Euler problem 500

The number of divisors of 120 is 16. In fact 120 is the smallest number having 16 divisors.

Find the smalle

9条回答
  •  醉酒成梦
    2020-12-29 08:23

    This is my Code. You can use Sieve to generate Prime numbers. If you have any suggestions to my code please suggest.

    def findfactors(num):
        list1=[]
        for i in range(num,1,-1):
            if num%i==0:
                list1.append(i)
        return list1
    
    def getcombinations(num):
        factors=findfactors(num)
        list1=[]
        if num==1:
            return 1
        for i in factors:
            if getcombinations(num//i)!=1:
                list1.append([i,getcombinations(num//i)])
            else:
                list1.append(i)
        return list1
    
    def unloadlist(list1):
        list2=[]
        if type(list1).__name__=="list":
            for i in list1[1]:
                if type(i).__name__=="list":
                    i=unloadlist(i)
                if type(i).__name__=="list":
                    flag=True
                    for j in i:
                        if type(j).__name__=="list":
                            list2.append([list1[0]]+j)
                            flag=False
                    if flag==True:
                        list2.append([list1[0]]+i)
                else:
                    list2.append([list1[0],i])
            if len(list2)==1:
                list2=list2[0]
        else:
            list2=list1
        return list2
    
    def mergeitems(list1):
        list2=[]
        for i in list1:
            if type(i).__name__=="int":
                list2.append((i,))
            elif type(i).__name__=="list":
                if type(i[0]).__name__!="list":
                    list2.append(tuple(sorted(i,reverse=True)))
                else:
                    for j in i:
                        list2.append(tuple(sorted(j,reverse=True)))
        set1=set(list2)
        return set1
    
    def find_smallest_number(num):
        #start writing your code here
        list1=getcombinations(num)
        for i in range(0,len(list1)):
            list1[i]=unloadlist(list1[i])
        mainlist=mergeitems(list1)
        possibles=[]
        primes=[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227]
        for i in mainlist:
            num=1
            for j in range(0,len(i)):
                num*=primes[j]**(i[j] - 1)
            possibles.append(num)
        return min(possibles)
    
    num=7
    print("The number of divisors :",num)
    result=find_smallest_number(num)
    print("The smallest number having",num," divisors:",result)
    

提交回复
热议问题