online: 3; azi: 743; total: 51198 Manual clasa a xi a - Implementarea structurilor de date - Lista liniara

Probleme Rezolvate



Manual clasa a Xi a

Implementarea structurilor de date

Lista liniara

Se citesc dintr-un fişier două numere foarte mari. Să se scrie următoarele subprograme pentru prelucrarea numerelor:
a. calcularea sumei, a diferenţei şi produsului numerelor;
b. compararea a două numere (subprogramul trebuie să verifice dacă cele două numere sunt egale, iar dacă nu sunt egale, să precizeze care număr este mai mare);
c. verificarea numărului dacă are un număr par sau un număr impar de cifre, fără să se numere cifrele numărului;
d. determinarea numărului de cifre ale unui număr;
e. verificarea numărului dacă este palindrom.
#include < iostream >
#include < fstream >
#include < string >
using namespace std ;
struct Node {
int data;
Node * prev ;
Node * next ;
};
Node * adaugaNod ( Node * tail , int data) {
Node * newNode = new Node ();
newNode ->data = data;
newNode -> prev = tail ;
newNode -> next = nullptr ;
if ( tail != nullptr ) {
tail -> next = newNode ;
}
return newNode ;
}
string suma( string a, string b) {
if ( a.length () < b.length ()) {
swap (a, b);
}
string result = "";
int carry = 0;
int n = a.length ();
int m = b.length ();
for ( int i = 0; i < n; i++) {
int sum = a[n - i - 1] - '0' + carry;
if (i < m) {
sum += b[m - i - 1] - '0';
}
carry = sum / 10;
sum %= 10;
result = char ( sum + '0') + result ;
}
if (carry) {
result = char (carry + '0') + result ;
}
return result ;
}
int comparare( string a, string b) {
if ( a.length () > b.length ()) {
return 1;
} else if ( a.length () < b.length ()) {
return -1;
} else {
for ( int i = 0; i < a.length (); i++) {
if (a[i] > b[i]) {
return 1;
} else if (a[i] < b[i]) {
return -1;
}
}
}
return 0;
}
string diferenta ( string a, string b) {
if (comparare(a, b) < 0) {
swap (a, b);
}
string result = "";
int borrow = 0;
int n = a.length ();
int m = b.length ();
for ( int i = 0; i < n; i++) {
int diff = a[n - i - 1] - '0' - borrow ;
if (i < m) {
diff -= b[m - i - 1] - '0';
}
if ( diff < 0) {
diff += 10;
borrow = 1;
} else {
borrow = 0;
}
result = char ( diff + '0') + result ;
}
while ( result [0] == '0' && result.length () > 1) {
result.erase ( result.begin ());
}
return result ;
}
string produs( string a, string b) {
int n = a.length ();
int m = b.length ();
string result (n + m, '0');
for ( int i = n - 1; i >= 0; i--) {
for ( int j = m - 1; j >= 0; j--) {
int prod = (a[i] - '0') * (b[j] - '0') + ( result [i + j + 1] - '0');
result [i + j + 1] = ( prod % 10) + '0';
result [i + j] += prod / 10;
}
}
while ( result [0] == '0' && result.length () > 1) {
result.erase ( result.begin ());
}
return result ;
}
bool paritateCifre ( string numar ) {
return numar.length () % 2 == 0;
}
int numarCifre ( string numar ) {
return numar.length ();
}
bool palindrom( string numar ) {
int i = 0, j = numar.length () - 1;
while (i < j) {
if ( numar [i] != numar [j]) {
return false;
}
i++;
j--;
}
return true ;
}
int main () {
ifstream fin("numere.txt");
string numar1, numar2;
fin >> numar1 >> numar2;
fin.close ();
cout << "Suma: " << suma(numar1, numar2) << endl ;
cout << " Diferenta : " << diferenta (numar1, numar2) << endl ;
cout << "Produs: " << produs(numar1, numar2) << endl ;
int comp = comparare(numar1, numar2);
if (comp == 0) {
cout << "Numerele sunt egale." << endl ;
} else {
cout << " Numarul " << (comp == 1 ? "1" : "2") << " este mai mare." << endl ;
}
cout << " Numarul 1 are " << ( paritateCifre (numar1) ? "par" : "impar") << " numar de cifre." << endl ;
cout << " Numarul 2 are " << ( paritateCifre (numar2) ? "par" : "impar") << " numar de cifre." << endl ;
cout << " Numarul 1 are " << numarCifre (numar1) << " cifre." << endl ;
cout << " Numarul 2 are " << numarCifre (numar2) << " cifre." << endl ;
cout << " Numarul 1 " << (palindrom(numar1) ? "este" : "nu este") << " palindrom." << endl ;
cout << " Numarul 2 " << (palindrom(numar2) ? "este" : "nu este") << " palindrom." << endl ;
return 0;
}