Как сравнить число в списке с суммой множителей следующего числа в списке? - PullRequest
0 голосов
/ 21 июня 2020

Я хочу сравнить число в списке с суммой факторов следующего числа в списке

Например, у меня есть список: [15,9,220,284]:

A=15 and the sum of the factors is = 1+3+5= 9
B=9 and the sum of the factors is 4 
so the program should return 0
A=220 and the sum of the factors is 284
B=284 and the sum of the factors is 220
so the program should return 1

1 Ответ

2 голосов
/ 21 июня 2020

Вы можете попробовать что-то вроде этого на основе этой функции divisors(n), которая кажется самой быстрой для вычисления множителей числа, я доказал это с помощью n=600851475143, и потребовалось 0.2790100000020175 seconds для запуска скрипта 1000000 раз, в то время как другие брали более 16 seconds с тем же номером:

def divisors(n):
    # get factors and their counts
    factors = {}
    nn = n
    i = 2
    while i*i <= nn:
        while nn % i == 0:
            factors[i] = factors.get(i, 0) + 1
            nn //= i
        i += 1
    if nn > 1:
        factors[nn] = factors.get(nn, 0) + 1

    primes = list(factors.keys())

    # generates factors from primes[k:] subset
    def generate(k):
        if k == len(primes):
            yield 1
        else:
            rest = generate(k+1)
            prime = primes[k]
            for factor in rest:
                prime_to_i = 1
                # prime_to_i iterates prime**i values, i being all possible exponents
                for _ in range(factors[prime] + 1):
                    yield factor * prime_to_i
                    prime_to_i *= prime

    # in python3, `yield from generate(0)` would also work
    for factor in generate(0):
        yield factor
        
lis=[15,9,220,284]
for x, y in zip(lis, lis[1:]):
    print('with ',x,' and ', y,': ' )  
    if (sum(list(divisors(x))[:-1])==y) and (sum(list(divisors(y))[:-1])==x):
        print('1\n')
    else:
        print('0\n')

Вывод:

with  15  and  9 : 
0

with  9  and  220 : 
0

with  220  and  284 : 
1

Или вы можете сохранить его в dict может быть более практичным:

lis=[15,9,220,284]
dct={}
for x, y in zip(lis, lis[1:]):  
    key=str(x)+'-'+str(y)
    if (sum(list(divisors(x))[:-1])==y) and (sum(list(divisors(y))[:-1])==x):
        dct.update({key:1})
    else:
        dct.update({key:0})
        
print(dct)

Вывод:

{'15-9': 0, '9-220': 0, '220-284': 1}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...