#include <iostream>
#include "bignum.h"
using namespace std;
int main() {
try {
bignum a;
std::cout<<'\n'<<std::string(50,'_')<<endl;
bignum b("-345");
std::cout<<'\n'<<std::string(50,'_')<<endl;
bignum c("4567");
std::cout<<'\n'<<std::string(50,'_')<<endl;
bignum d("7891");
std::cout<<'\n'<<std::string(50,'_')<<endl;
// bignum d("4-567");
std::cout<<'\n'<<std::string(50,'_')<<endl;
cout<<"this ->"<<b+c<<"<-wynik"<<endl; ///wynik 4912
std::cout<<'\n'<<std::string(50,'_')<<endl;
cout<<"this ->"<<d+c<<"<-wynik"<<endl; ///wynik 12458
} catch(bignum) {
exit(-1);
} catch(bignum::formaterr) {
exit(-2);
} catch(...) {
exit(-3);
}
return 0;
}
#include "bignum.h"
#define o(x) std::cout<<'\n'<<#x<<'='<<x<<std::endl;
std::string filename() {
size_t pozslash=std::string(__FILE__).rfind('/');
if((pozslash+1))
return std::string(__FILE__).substr(pozslash+1);
size_t pozbackslash=std::string(__FILE__).rfind('\\');
if((pozbackslash+1))
return std::string(__FILE__).substr(pozbackslash+1);
return std::string(__FILE__);
}
size_t errornr{};
std::string clnam(const std::string& s="") {return s.size()? " in class "+s+' ':""; }
#define err(class) std::cout<<'\n'<<std::string(50,'v')<<'\n'<<"ERROR "<<filename()<<"<- error nr "<<errornr++ <<clnam(#class)<<'\n'<<std::string(50,'^')<<std::endl;//
#define o(x) std::cout<<'\n'<<#x<<'='<<x<<std::endl;
using std::cout;
using std::endl;
bignum::bignum(const std::string& longnum):size{longnum.size()} {
o(size);
errornr=0;
switch(longnum.find('-')) {
case 0:
o("ujemna liczba");
sign='-';
size--;
break;
case static_cast<size_t>(-1):
o("dodatnie");
break;
default:
correct = false;
err(bignum);
std::cerr<<"bledna liczba 1"<<std::endl;
// exit(-1);
throw formaterr();
break;
}
// std::cout<<longnum.size()<<").";
if(longnum.size())
ptrlgnr=new char[longnum.size()] {};
if(ptrlgnr)
for(auto it=longnum.cbegin(), end=longnum.cend(),last=end-1; it!=end; it++) {
switch(*it) {
case '0' ... '9':
ptrlgnr[last-it]=*it-'0';
break;
case '-':
ptrlgnr[last-it]=*it;
break;
case 0:
ptrlgnr[last-it]=*it;
break;
default:
correct=false;
err(bignum);
std::cout<<*it+'0'<<'|';
std::cerr<<"bledna liczba 2"<<std::endl;
// throw formaterr::ferr;
break;
}
}
for(size_t i=0; i+1<longnum.size(); i++)
std::cout<<static_cast<short>(ptrlgnr[i])<<'\t';
char lastdigit=ptrlgnr[longnum.size()-1];
if(lastdigit=='-')
std::cout<<static_cast<char>(lastdigit)<<'\t';
else
std::cout<<static_cast<short>(lastdigit)<<'\t';
std::cout<<std::endl;
std::cout<<'\n'<<std::string(50,'?')<<"\nkoniec konstruktora size="<<size<<'\n'<<std::string(50,'?')<<std::endl;
}
bignum::~bignum() {
if(ptrlgnr)
delete[]ptrlgnr;
o("usuniento")
}
//bignum::bignum(const bignum& other) {
//
//}
bignum& bignum::operator=(const bignum& rhs) {
if(this == &rhs)
return *this; // handle self assignment
//assignment operator
return *this;
}
bignum operator + (const bignum& lhs,const bignum& rhs) {
char flag =(lhs.size>rhs.size)?1:0;
size_t size=(lhs.size>rhs.size)?lhs.size:rhs.size;
bignum* ptr=new bignum{std::string(size+1,char{})};
switch(flag) {
case 1: {
ptr->add(lhs,rhs, ptr);
break;
}
case 0: {
ptr->bignum::add(rhs,lhs, ptr);
break;
}
default:
err(bignum);
}
return *ptr;
}
std::ostream & operator << (std::ostream & os, const bignum & bn) {
size_t tabsize=bn.size;
char * tab = bn.ptrlgnr;
os<< tabsize<<"\t";
for(size_t i=tabsize-1; i<tabsize; i--)
os<<(short)tab[i]<<' ';
return os;
}
void bignum::add(const bignum & ptrbigger,const bignum &ptrlower, bignum* ptr) {
size_t bigger = ptrbigger.size;
size_t lower = ptrlower.size;
char mem{};
size_t i=0;
/// for(; i+lower<bigger; i++) { // pamienta� by sumowa� przy size_t -> i<bigger-lower <-tak pentla niesko�czona
for(; i<lower; i++) {
// o((int)ptrbigger.ptrlgnr[i])o((int)ptrlower.ptrlgnr[i])o(ptrbigger.ptrlgnr[i]+ptrlower.ptrlgnr[i])o(ptrbigger.ptrlgnr[i]+ptrlower.ptrlgnr[i]+mem)
mem=ptrbigger.ptrlgnr[i]+ptrlower.ptrlgnr[i]+mem;
ptrlgnr[i]=mem%10;
// o((int)mem)
mem/=10;
// o((int)mem)
}
while(mem)
if(i<bigger) {
mem=ptrbigger.ptrlgnr[i]+mem;
ptr->ptrlgnr[i]=mem%10;
mem/=10;
i++;
} else {
ptr->ptrlgnr[i]=1; //mem%10=1;
break;
}
for(; i<bigger; i++) {
ptr->ptrlgnr[i]=ptrbigger.ptrlgnr[i];
}
if(!mem)
size--; //je�eli pierwsze 0
}
#ifndef BIGNUM_H
#define BIGNUM_H
#include <iostream>
class bignum {
public:
bignum(const std::string& longnum = "0");
bignum& operator=(const bignum& other);
virtual ~bignum();
// size_t Getm_Counter() { return m_Counter; }
// void Setm_Counter(unsigned int val) { m_Counter = val; }
void setnumtab(char* tabnum,size_t tabnumsize) {
ptrlgnr=tabnum;
size=tabnumsize;
}
struct formaterr {static formaterr ferr;};
private:
friend bignum operator + (const bignum& lhs,const bignum& rhs);
friend std::ostream & operator << (std::ostream & os, const bignum & bn);
// bignum(const bignum& other);
// size_t m_Counter;
size_t size;
char * ptrlgnr{nullptr};
char sign{};
bool correct =true;
void add(const bignum & ptrbigger,const bignum &ptrlower, bignum* ptr);
};
#endif // BIGNUM_H