0695 - SumAll

De la Universitas MediaWiki
Versiunea din 4 iunie 2024 08:42, autor: Danciu (discuție | contribuții) (Pagină nouă: = Cerința = Fie <code>N</code> un număr natural format din cifre nenule. Să se determine suma tuturor numerelor distincte ce se pot forma cu toate cifrele numărului <code>N</code>. = Date de intrare = Fișierul de intrare <code>sumall.in</code> conține pe prima linie numărul <code>N</code>. = Date de ieșire = Fișierul de ieșire <code>sumall.out</code> va conţine pe prima linie suma tuturor numerelor distincte ce se pot forma cu toate cifrele numărului <code>N</...)
(dif) ← Versiunea anterioară | Versiunea curentă (dif) | Versiunea următoare → (dif)

Cerința

Fie N un număr natural format din cifre nenule.

Să se determine suma tuturor numerelor distincte ce se pot forma cu toate cifrele numărului N.

Date de intrare

Fișierul de intrare sumall.in conține pe prima linie numărul N.

Date de ieșire

Fișierul de ieșire sumall.out va conţine pe prima linie suma tuturor numerelor distincte ce se pot forma cu toate cifrele numărului N.

Restricții și precizări

  • 0 < N < 1019

Exemplu:

sumall.in

123

sumall.out

1332

Explicație

Toate numerele distincte ce se pot forma cu cifrele 1, 2, 3 sunt:

123, 132, 213, 231, 312, 321.

123 + 132 + 213 + 231 + 312 + 321 = 1332

Exemplu:

sumall.in

788

sumall.out

2553

Explicație

Toate numerele distincte ce se pot forma cu cifrele 7, 8, 8 sunt:

788, 878, 887

788 + 878 + 887 = 2553

Rezolvare

def generate_numbers(n, digits, used_digits, current_number, numbers):
    if len(current_number) == len(digits):
        numbers.append(int(current_number))
        return

    for digit in digits:
        if digit not in used_digits:
            used_digits[digit] = True

            current_number += digit

            generate_numbers(n, digits, used_digits, current_number, numbers)

            current_number = current_number[:-1]

            used_digits[digit] = False

def calculate_sum_of_distinct_numbers(n):
    digits = [int(d) for d in str(n)]  

    numbers = []  # List to store distinct numbers
    used_digits = {}  # Dictionary to track used digits

    generate_numbers(n, digits, used_digits, "", numbers)

    numbers.sort()

    sum_of_distinct_numbers = 0
    for i in range(len(numbers)):
        if i == 0 or numbers[i] != numbers[i - 1]:
            sum_of_distinct_numbers += numbers[i]

    return sum_of_distinct_numbers

def main():
    with open("sumall.in", "r") as input_file:
        n = int(input_file.readline())

    sum_of_distinct_numbers = calculate_sum_of_distinct_numbers(n)

    with open("sumall.out", "w") as output_file:
        output_file.write(str(sum_of_distinct_numbers))

if __name__ == "__main__":
    main()