Ja skombinowałem coś takiego za pomocą rozwiązywanego kiedyś zadanka ze spoja:
Kopiuj
#include <iostream>
#include <string>
#include <vector>
#include <cstdlib>
#include <sstream>
struct Para {
std::string a,b;
};
std::string dodaj(Para para);
std::string pomnoz(Para para);
int main() {
std::string one,two;
std::cin >> one;
std::cin >> two;
Para p;
p.a = one;
p.b = two;
std::cout << pomnoz(p);
}
void toArrayInt(std::string source, std::vector<int> & dest) {
for(int i = 0; i < source.length(); i++) {
char temp[2];
temp[0] = source[i];
temp[1] = 0;
dest.push_back(atoi(temp));
}
}
std::string dodaj(Para para) {
int dalej = 0; //określa część dziesiętna podczas przepełnienia
std::vector<int> tabA,tabB;
std::string result = "";
toArrayInt(para.a,tabA);
toArrayInt(para.b,tabB);
std::vector<int>::reverse_iterator itA = tabA.rbegin();
std::vector<int>::reverse_iterator itB = tabB.rbegin();
for(; itA != tabA.rend() || itB != tabB.rend();) {
int suma;
bool end = false; //true gdy jest to ostatnia iteracja pętli
if(itA != tabA.rend() && itB != tabB.rend()) {
suma = *itA + *itB + dalej;
++itA;
++itB;
} else if(itB != tabB.rend()){
suma = *itB + dalej;
++itB;
} else {
suma = *itA + dalej;
++itA;
}
if(itA == tabA.rend() && itB == tabB.rend()) {
end = true;
}
//sprawdzam czy wyszła dwucyfrowa liczba
int cyfra;
cyfra = suma % 10;
suma /= 10;
if(suma != 0)
dalej = 1;
else
dalej = 0;
std::stringstream ss;
ss << cyfra;
ss << dalej;
result.insert(result.begin(), ss.str()[0]);
if(end && dalej) {
result.insert(result.begin(), ss.str()[1]); //wtedy gdy to jest ostatnia iteracja pętli
}
}
return result;
}
std::string pomnoz(Para para) {
Para num;
num.a = para.a;
num.b = para.a;
std::string wynikPary = dodaj(num);
std::string licznik = "0";
std::string akumulator = "0";
bool state = false;
while(para.b != licznik) {
//musimy iterować whilem "wielgachna liczba dzielona na 2".
if(state) {
Para p;
p.a = akumulator;
p.b = wynikPary;
akumulator = dodaj(p);
state = false;
}
else {
state = true;
}
Para p;
p.a = licznik;
p.b = "1";
licznik = dodaj(p);
}
return akumulator;
}
NIe jest to w pełni działający program jest on w stanie pomnożyć nieskończenie wielką liczbę(podawaną pierwszą na wejściu) z drugą liczba maks 4 cyfrowa i w dodatku parzystą. Ja chcę tylko zilustrować metodę. Jak by ktoś poprawił ten kod to by szło mnożyć nieskończenie wielkie liczby(z potęgowaniem nie było by problemu). Główny błąd polega na tym iż w pętli while mam iterować bardzo dużą ilość raz(liczba ta jest w stringu) i nie mam pojęcią jak zrobić to wydajniej. W obecnej chwili mam stringa i za każdym obiegiem pętli dodaje do niego stringa "1" i później powrównuje stringi w warunku while jeśli są nierówne pętla ma iterować dalej.