예제 #1
0
파일: problem043.py 프로젝트: kju2/euler
def main():
    """
    >>> main()
    16695334890
    """
    base = frozenset(xrange(10))

    result = 0
    for d4 in [0, 2, 4, 6, 8]:  # to be divisible by 2
        d6 = 5  # otherwise d_7 and d_8 must be equal to be divisible by 11

        for div11 in range(506, 605, 11):  # divisible by 11
            _, d7, d8 = int_to_list(div11)

            number = set([d4, d6])
            if d7 in number or d8 in number:
                continue  # not pandigital

            for div17 in range(102, 1003, 17):  # divisible by 17
                if div17 < d8 * 100 or div17 > (d8 + 1) * 100:
                    continue  # d8 doesn't match

                _, d9, d10 = int_to_list(div17)

                number = set([d4, d6, d7, d8])
                if d9 in number or d10 in number:
                    continue  # not pandigital

                if list_to_int([d7, d8, d9]) % 13 != 0:
                    continue  # not divisible by 13

                number = set([d4, d6, d7, d8, d9, d10])
                for d3 in base - number:

                    number = set([d3, d4, d6, d7, d8, d9, d10])
                    for d5 in base - number:

                        if list_to_int([d3, d4, d5]) % 3 != 0:
                            continue  # not divisible by 3

                        if list_to_int([d5, d6, d7]) % 7 != 0:
                            continue  # not divisible by 7

                        number = set([d3, d4, d5, d6, d7, d8, d9, d10])
                        for d2 in base - number:

                            number = set([d2, d3, d4, d5, d6, d7, d8, d9,
                                         d10, 0])
                            for d1 in base - number:
                                result += list_to_int([
                                    d1, d2, d3, d4, d5, d6, d7, d8, d9, d10])

    print(result)
예제 #2
0
파일: problem038.py 프로젝트: kju2/euler
def main():
    """
    >>> main()
    932718654
    """
    max_len_number = 9
    max_pandigital_number = 0
    # since the multiplier must be at least 2 we can stop when the
    # multiplicand * 1 and multiplicand * 2 together have more than 9 numbers
    for multiplicand in range(2, 10000):
        product_as_list = int_to_list(multiplicand)
        for multiplier in count(2):
            product_as_list += int_to_list(multiplicand * multiplier)
            product = list_to_int(product_as_list)

            if is_int_pandigital(product) and max_pandigital_number < product:
                max_pandigital_number = product
            elif len(product_as_list) > max_len_number:
                break

    print(max_pandigital_number)
예제 #3
0
파일: problem056.py 프로젝트: kju2/euler
def main():
    """
    >>> main()
    972
    """
    max_digit_sum = 0
    for a in range(1, 100):
        for b in range(1, 100):
            digit_sum = sum(int_to_list(a ** b))
            if digit_sum > max_digit_sum:
                max_digit_sum = digit_sum

    print(max_digit_sum)
예제 #4
0
파일: problem092.py 프로젝트: kju2/euler
def main():
    """
    >>> main()
    8581146
    """
    chains_that_arrive_at_89 = 0
    for number in combinations_with_replacement(xrange(10), 7):
        n = list_to_int(number)
        while n != 1 and n != 89 and n != 0:
            n = sum([d ** 2 for d in int_to_list(n)])

        if n == 89:
            chains_that_arrive_at_89 += count_permutations_of(number)

    print(chains_that_arrive_at_89)
예제 #5
0
파일: problem034.py 프로젝트: kju2/euler
def main():
    """
    >>> main()
    40730
    """
    factorials = [factorial(n) for n in range(10)]

    summe = -3  # 1 & 2 which are not counted
    for num_digits in range(8):  # upper limit: 7 * 9! < 10**7
        for number in combinations_with_replacement(xrange(10), num_digits):
            factorial_sum = sum((factorials[digit] for digit in number))
            if sorted(int_to_list(factorial_sum)) == list(number):
                summe += factorial_sum

    print(summe)
예제 #6
0
파일: problem035.py 프로젝트: kju2/euler
def main():
    """
    >>> main()
    55
    """
    even_digits = frozenset([d for d in range(0, 10, 2)])

    primes = Primes(10 ** 6)

    count_circular_primes = 1  # for the prime 2
    for prime in primes:
        # Exculde all primes that have an even digit in it.
        if not even_digits.isdisjoint(int_to_list(prime)):
            continue

        if all((rotated_prime in primes for rotated_prime in rotate(prime))):
            count_circular_primes += 1

    print(count_circular_primes)
예제 #7
0
파일: problem051.py 프로젝트: kju2/euler
def main():
    """
    >>> main()
    121313
    """
    amount_of_primes = 8

    primes = Primes(10 ** 6)
    for prime in primes:
        prime_as_list = int_to_list(prime)

        list_of_indices = []  # indices of reoccuring digits
        for i in range(len(prime_as_list)):
            for j in range(i + 1, len(prime_as_list)):
                for k in range(j + 1, len(prime_as_list)):
                    if prime_as_list[j] == prime_as_list[k]:
                        list_of_indices.append((i, j, k))

        for indices in list_of_indices:
            prime_family = []
            for d in range(10):
                prime_candidate = prime_as_list[:]
                for i in indices:
                    prime_candidate[i] = d

                # ensure that we don't look at n-1-digit numbers
                if prime_candidate[0] == 0:
                    continue

                prime_candidate = list_to_int(prime_candidate)
                if prime_candidate in primes:
                    prime_family.append(prime_candidate)

                # check if we still can get the neccasry amount of primes
                if (10 - d) + len(prime_family) < amount_of_primes:
                    break

            if len(prime_family) == amount_of_primes:
                print(prime)
                return
예제 #8
0
파일: problem035.py 프로젝트: kju2/euler
def rotate(number):
    """ return all rotations of this number"""
    digits = int_to_list(number)
    for _ in range(len(digits)):
        yield list_to_int(digits)
        digits.append(digits.pop(0))