1078 - Adun Scad

From Bitnami MediaWiki
Revision as of 17:42, 26 December 2023 by Andrada378 (talk | contribs) (Pagină nouă: Considerăm un număr întreg N şi un şir de M cifre zecimale nenule. Să se determine dacă numărul N poate fi rezultatul unei expresii aritmetice simple (fără paranteze), formată exclusiv din cifrele şirului citit şi din operatorii aritmetici desemnaţi pentru operaţiile de adunare şi scădere (+, -). ''<u>'''Cerinţă'''</u>'' Scrieţi un program care citeşte numerele N şi M de pe prima linie a fişierului de intrare şi şirul de M cifre de pe linia următoa...)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

Considerăm un număr întreg N şi un şir de M cifre zecimale nenule. Să se determine dacă numărul N poate fi rezultatul unei expresii aritmetice simple (fără paranteze), formată exclusiv din cifrele şirului citit şi din operatorii aritmetici desemnaţi pentru operaţiile de adunare şi scădere (+, -).

Cerinţă

Scrieţi un program care citeşte numerele N şi M de pe prima linie a fişierului de intrare şi şirul de M cifre de pe linia următoare şi determină şi afişează expresia găsită sau valoarea 0 în cazul în care nu există soluţie.

Date de intrare

Fișierul de intrare adunscad.in conține pe prima linie numerele întregi N M, separate printr-un spaţiu, reprezentând valoarea ce trebuie obţinută la evaluarea expresiei şi numărul de cifre din şir. Linia a doua a fişierului de intrare conţine şirul celor M cifre nenule, separate prin câte un spaţiu.

Date de ieșire

Fișierul de ieșire adunscad.out va conține pe prima linie expresia determinată, în cazul în care există soluţie, sau valoarea 0 în cazul în care nu există soluţie.

Restricții și precizări

-180 ≤ N ≤ 180

2 ≤ M ≤ 20

în şirul citit cifrele se pot repeta

toate cifrele din şir trebuie să apară şi în expresia aritmetică, în aceeaşi ordine în care au fost citite

în expresia aritmetică, orice cifră trebuie să fie precedată de un operator; în cazul în care prima cifră este precedată de operatorul '+' acesta nu se pune în expresie

în expresia aritmetică nu există spaţii

expresia aritmetică se termină cu caracterul sfârşit de linie

în cazul în care soluţia nu este unică se va afişa o soluţie corectă

Exemplu 1

adunscad.in

21 4

3 9 1 8

adunscad.out

3+9+1+8

Exemplu 2

adunscad.in

-1 4

1 2 3 5

adunscad.out

-1+2+3-5

Exemplu 3

adunscad.in

-7 7

1 1 1 1 1 1 1

adunscad.out

-1-1-1-1-1-1-1

Exemplu 4

adunscad.in

12 3

1 2 3

adunscad.out

0

Rezolvare

def gaseste_expresie(N, cifre):

    M = len(cifre)

    for i in range(1 << (M - 1)):

        expresie = str(cifre[0])

        valoare = int(cifre[0])

        for j in range(M - 1):

            if (i >> j) & 1:

                expresie += '+' + str(cifre[j + 1])

                valoare += int(cifre[j + 1])

            else:

                expresie += '-' + str(cifre[j + 1])

                valoare -= int(cifre[j + 1])

        if valoare == N:

            return expresie

    return 0

# Citire date de intrare

with open("adunscad.in", "r") as file:

    N, M = map(int, file.readline().split())

    cifre = list(map(int, file.readline().split()))

# Găsire expresie sau 0 în cazul în care nu există soluție

rezultat = gaseste_expresie(N, cifre)

# Scriere rezultat în fișierul de ieșire

with open("adunscad.out", "w") as file:

    file.write(str(rezultat))