3025 - PCR

From Bitnami MediaWiki

Cerința[edit | edit source]

Se dă n un număr natural. Cifrele lui n se permută pentru a forma un număr natural, de aceeași lungime cu n, și care să fie palindrom. Aflați câte asemenea numere se pot obține.

Date de intrare[edit | edit source]

Programul citește de la tastatură numărul n.

Date de ieșire[edit | edit source]

Programul va afișa pe ecran numărul de palindromuri care se pot obține prin permutarea cifrelor lui n.

Restricții și precizări[edit | edit source]

Exemplu:[edit | edit source]

Intrare

1102022

Ieșire

4

Explicație[edit | edit source]

Permutând cifrele lui 1102022 se pot obține următoarele palindromuri de aceeași lungime cu 1102022: 1022201, 1202021, 2012102, 2102012.

Rezolvare[edit | edit source]

<syntaxhighlight lang="python3"> def count_palindrome_permutations(n):

   total_palindromes = 0
   num_even_digits = 0
   num_odd_digits = 0
   duplicated_digit_count = 0
   while n > 0:
       digit = n % 10
       if digit % 2 == 0:
           num_even_digits += 1
       else:
           num_odd_digits += 1
       n //= 10
   if num_even_digits > 1 or num_odd_digits > 1:
       duplicated_digit_count = 1
   if num_even_digits % 2 == 0:
       total_palindromes += (num_even_digits // 2)! * (num_odd_digits // 2)!
   if num_odd_digits % 2 == 0:
       total_palindromes += (num_odd_digits // 2)! * (num_even_digits // 2)!
   if num_odd_digits == 1 and num_even_digits > 0:
       total_palindromes += (num_even_digits // 2)! * duplicated_digit_count
   if num_even_digits == 1 and num_odd_digits > 0:
       total_palindromes += (num_odd_digits // 2)! * duplicated_digit_count
   return total_palindromes

def main():

   n = int(input())
   palindrome_count = count_palindrome_permutations(n)
   print(palindrome_count)

if __name__ == "__main__":

   main()

</syntaxhighlight>