Witam,
mam na celu znalezienie NWD dla dużych liczb, wykraczających poza przedział long long. Operacji dokonuje na stringach, jednak pojawia się jeden szkopuł dla dużych liczb - program się crashuje z niewiadomych dla mnie przyczyn. Kilkakrotnie analizowałem kod, ale nie widzę, że niespójności logicznych. Proszę o pomoc. Kod ma 90 linijek, stąd wiem, że jego przejrzenie może okazać się nieco trudne.```
#include <iostream>
#include <cstring>
using namespace std;
inline string odejmij(string a, string b){
//WYNIK WYJSCIOWY Z DODAWANIA
string wynik = "";
//DLUGOSC STRINGOW
int strAd, strBd;
//PRZENIESIENIE
int p = 0;
//WYROWNANIE LICZB
while(a.size() - b.size() > 0) b = "0" + b;
cout << a << ' ' << b << endl;
strAd = a.size() - 1;
strBd = b.size() - 1;
while(strAd >= 0 || strBd >= 0){
//buforA, buforB, wynik
int bufA = 0;
int bufB = 0;
int w = 0;
if(strAd >= 0) bufA = a[strAd] - 48; else bufA = 0;
if(strBd >= 0) bufB = b[strBd] - 48; else bufB = 0;
if((bufA - bufB - p ) < 0) { w = bufA - bufB - p + 10; p = 1; }
else if((bufA - bufB - p) == 0) { w = 0; p = 0; }
else {w = bufA - bufB - p; p = 0;}
wynik = "0" + wynik;
wynik[0] = 48 + w;
strAd--;
strBd--;
}
string wynikF = "";
//USUNIECIE ZER Z POCZATKU
int s = 0;
for(int i = 0; i < wynik.size(); i++){
if(wynik[i] == 48) s += 1;
else break;
}
for(int i = s; i < wynik.size(); i++){
wynikF += wynik[i];
}
if(wynikF.size() == 0) wynikF += 48;
return wynikF;
}
inline string NWD(string, string);
inline string wiekszy(string strA, string strB){
int dlA = strA.size();
int dlB = strB.size();
if(dlA > dlB) { return NWD(odejmij(strA, strB), strB); }
else if(dlB > dlA) { return NWD(odejmij(strB, strA), strA); }
else{
for(int i = 0; i < dlA; i++){
if(strA[i] > strB[i]) { return NWD(odejmij(strA, strB), strB);}
else if(strA[i] < strB[i]) { return NWD(odejmij(strB, strA), strA);}
}
}
}
inline string NWD(string a, string b){
if(a == b) return a;
else return wiekszy(a, b);
}
int main(){
ios_base::sync_with_stdio(NULL);
cin.tie(nullptr);
string strA, strB;
cin >> strA >> strB;
cout << NWD(strA, strB);
}