1078 - Adun Scad: Difference between revisions
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... |
Andrada378 (talk | contribs) No edit summary |
||
Line 1: | Line 1: | ||
== Enunț == | |||
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 (+, -). | 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. | 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 adunscadin.txt 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. | |||
Fișierul de intrare | |||
în | == Date de ieșire == | ||
Fișierul de ieșire adunscadout.txt 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 == | |||
în cazul în care soluţia nu este unică se va afişa o soluţie corectă | * -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 | == Exemplu 1 == | ||
'''adunscadin.txt''' | |||
21 4 | 21 4 | ||
Line 39: | Line 29: | ||
3 9 1 8 | 3 9 1 8 | ||
'''adunscadout.txt''' | |||
3+9+1+8 | 3+9+1+8 | ||
Exemplu 2 | == Exemplu 2 == | ||
'''adunscadin.txt''' | |||
-1 4 | -1 4 | ||
Line 51: | Line 40: | ||
1 2 3 5 | 1 2 3 5 | ||
'''adunscadout.txt''' | |||
-1+2+3-5 | -1+2+3-5 | ||
Exemplu 3 | == Exemplu 3 == | ||
'''adunscadin.txt''' | |||
-7 7 | -7 7 | ||
Line 63: | Line 51: | ||
1 1 1 1 1 1 1 | 1 1 1 1 1 1 1 | ||
'''adunscadout.txt''' | |||
-1-1-1-1-1-1-1 | -1-1-1-1-1-1-1 | ||
Line 69: | Line 57: | ||
Exemplu 4 | Exemplu 4 | ||
'''adunscadin.txt''' | |||
12 3 | 12 3 | ||
Line 75: | Line 63: | ||
1 2 3 | 1 2 3 | ||
'''adunscadout.txt''' | |||
0 | 0 | ||
== Rezolvare == | |||
<syntaxhighlight lang="python"> | |||
def validare_date(N, M, cifre): | |||
if not (-180 <= N <= 180): | |||
return False | |||
if not (2 <= M <= 20): | |||
return False | |||
if len(cifre) != M: | |||
return False | |||
return True | |||
def gaseste_expresie(N, cifre): | 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" | |||
with open(" | # Citire date de intrare | ||
with open("adunscadin.txt", "r") as file: | |||
N, M = map(int, file.readline().split()) | |||
cifre = list(map(int, file.readline().split())) | |||
# Validare date | |||
if not validare_date(N, M, cifre): | |||
print("Datele de intrare nu sunt valide.") | |||
exit() | |||
# Găsire expresie sau 0 în cazul în care nu există soluție | |||
rezultat = gaseste_expresie(N, cifre) | rezultat = gaseste_expresie(N, cifre) | ||
# Scriere rezultat în fișierul de ieșire | |||
with open("adunscadout.txt", "w") as file: | |||
with open(" | file.write(str(rezultat)) | ||
</syntaxhighlight> | |||
Latest revision as of 11:32, 5 January 2024
Enunț[edit | edit source]
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ţă[edit | edit source]
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[edit | edit source]
Fișierul de intrare adunscadin.txt 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[edit | edit source]
Fișierul de ieșire adunscadout.txt 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[edit | edit source]
- -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[edit | edit source]
adunscadin.txt
21 4
3 9 1 8
adunscadout.txt
3+9+1+8
Exemplu 2[edit | edit source]
adunscadin.txt
-1 4
1 2 3 5
adunscadout.txt
-1+2+3-5
Exemplu 3[edit | edit source]
adunscadin.txt
-7 7
1 1 1 1 1 1 1
adunscadout.txt
-1-1-1-1-1-1-1
Exemplu 4
adunscadin.txt
12 3
1 2 3
adunscadout.txt
0
Rezolvare[edit | edit source]
<syntaxhighlight lang="python"> def validare_date(N, M, cifre):
if not (-180 <= N <= 180): return False if not (2 <= M <= 20): return False if len(cifre) != M: return False return True
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("adunscadin.txt", "r") as file:
N, M = map(int, file.readline().split()) cifre = list(map(int, file.readline().split()))
- Validare date
if not validare_date(N, M, cifre):
print("Datele de intrare nu sunt valide.") exit()
- 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("adunscadout.txt", "w") as file:
file.write(str(rezultat))
</syntaxhighlight>