/c++/dynamic array/source/BIG_INT_NUMBERS.CPP
C++ | 279 lines | 215 code | 64 blank | 0 comment | 32 complexity | 8200ec05d6d3bba8ebe0d09443430bbc MD5 | raw file
- #include <iostream>
- #include <stdio.h>
- #include "string.h"
- #include "darray.h"
- #include "math.h"
- #include "big_integer_numbers.h"
- #define IF_RETURN(expression,ret) if(expression) {return ret;}
- BIG_INT_NUMBERS::BIG_INT_NUMBERS(char *_str):darray(strlen(_str)+1)
- {
- int point=0;
- chek_if_valid(_str,&point);
- int i_bef_dot=(int)strlen(_str)-point+1;
- if(point==0)
- {
- i_bef_dot=0;
- }
- for(int i=0;i<((int)strlen(_str)-i_bef_dot);i++)
- {
- inser_last(*(_str+i)-'0');
- }
- char* str=new char[((int)strlen(_str))-i_bef_dot+1];
- memcpy(str,_str,((int)strlen(_str))-i_bef_dot);
- *(str+(int)strlen(_str)-i_bef_dot+1)='\0';
- big_num=str;
- cout<<"your number is"<<str<<endl;
- }
- BIG_INT_NUMBERS:: BIG_INT_NUMBERS(int _num)
- {
- char _str[100];
- int point=0;
- sprintf(_str,"%d",_num);
- chek_if_valid(_str,&point);
- for(int i=0;i<(int)strlen(_str);i++)
- {
- inser_last(*(_str+i)-'0');
- }
- char* str=new char[strlen(_str)+1];
- strcpy(str,_str);
- big_num=str;
- }
- const int* BIG_INT_NUMBERS::operator[](const int& _index)const
- {
- if(elements<_index)
- {
- return 0;
- }
- return *(array+_index-1);
- }
- ostream& operator<<(ostream& os,const BIG_INT_NUMBERS& _num)
- {
- if (! _num.get_size())
- {
- return os<<endl<<"you don't have number"<<endl;
- }
- for(int i=0;i<_num.get_size();i++)
- {
- cout<<*_num[i+1];
- }
- return os<<endl<<"table of your elements"<<endl;
- }
- BIG_INT_NUMBERS BIG_INT_NUMBERS::operator+(const BIG_INT_NUMBERS& _num)const
- {
- BIG_INT_NUMBERS temp;
- int i=0;
- int carry=0;
- temp.inser_last((*operator[](elements-i)+*_num[_num.elements-i])%10);
- carry=(*operator[](elements-i)+*_num[_num.elements-i])/10;
- i++;
- while (1)
- {
- if(((elements-i)==0)&&((_num.elements-i)==0))
- {
- if (carry)
- {
- temp.insert_element_bef(i,carry);
- }
- char* str=new char[elements+1];
- temp.copy_to_str(str);
- return temp;
- }
- else if((elements-i!=0)&&((_num.elements-i)!=0))
- {
- temp.insert_element_bef(i,((*operator[](elements-i))+(*_num[_num.elements-i])+carry)%10);
- carry=(*operator[](elements-i)+*_num[_num.elements-i]+carry)/10;
- i++;
- }
- else if(((elements-i)!=0))
- {
- temp.insert_element_bef(i,(*operator[](elements-i)+carry)%10);
- carry=(*operator[](elements-i)+carry)/10;
- i++;
- }
- else if(((_num.elements-i)!=0))
- {
- temp.insert_element_bef(i,(*_num[_num.elements-i]+carry)%10);
- carry=(*_num[_num.elements-i]+carry)/10;
- carry=0;
- i++;
- }
- }
- }
- BIG_INT_NUMBERS BIG_INT_NUMBERS::operator-(const BIG_INT_NUMBERS& _num)const
- {
- BIG_INT_NUMBERS temp;
- int i=0;
- int carry=0;
- if((*operator[](elements-i)-*_num[elements-i]-carry)>0)
- {
- temp.inser_last(*operator[](elements-i)-*_num[elements-i]-carry);
- carry=0;
- i++;
- }
- else if (((*operator[](elements-i)-*_num[elements-i]-carry)<0))
- {
- temp.inser_last(*operator[](elements-i)-*_num[elements-i]+10);
- carry=1;
- i++;
- }
- else
- {
- temp.inser_last(0);
- i++;
- carry=0;
- }
- while (1)
- {
- if((elements-i==0)&&(_num.elements-i==0))
- {
- if (carry)
- {
- temp.insert_element_bef(i,carry);
- }
- char* str=new char[elements+1];
- temp.copy_to_str(str);
- return temp;
- }
- else if((elements-i!=0)&&(_num.elements-i!=0))
- {
- if((*operator[](elements-i)-*_num[elements-i]-carry)>0)
- {
- temp.insert_element_bef(i,*operator[](elements-i)-*_num[elements-i]-carry);
- carry=0;
- i++;
- }
- else if (((*operator[](elements-i)-*_num[elements-i]-carry)<0))
- {
- temp.insert_element_bef(i,*operator[](elements-i)-*_num[elements-i]+10);
- carry=1;
- i++;
- }
- else
- {
- temp.insert_element_bef(i,0);
- i++;
- carry=0;
- }
- }
- else if((elements-i!=0))
- {
- temp.insert_element_bef(i,(*operator[](elements-i)+carry));
- carry=0;
- i++;
- }
- else
- {
- temp.insert_element_bef(i,0);
- i++;
- }
- }
- }
- BIG_INT_NUMBERS BIG_INT_NUMBERS::operator*(const BIG_INT_NUMBERS& _num)const
- {
- BIG_INT_NUMBERS temp2;
- int i=0;
- while(_num.elements>=i)
- {
- int j=0;
- while(elements>j)
- {
- BIG_INT_NUMBERS temp1((int)(pow(10,i)*(*_num[elements-i])*(*operator[](elements-j))));
- temp2=temp2+temp1;
- cout<<temp2<<endl;
- j++;
- }
- i++;
- }
- return temp2;
- }
- const BIG_INT_NUMBERS& BIG_INT_NUMBERS::operator=(const BIG_INT_NUMBERS& _num)
- {
- remove_and_delete_all();
- delete[] big_num;
- big_num=new char[strlen(_num.big_num)];
- strcpy(big_num,_num.big_num);
- for(int i=1;i<_num.elements+1;i++)
- {
- inser_last(*_num[i]);
- }
- return *this;
- }
- BIG_INT_NUMBERS BIG_INT_NUMBERS::operator/(const BIG_INT_NUMBERS& _num)const
- {
- BIG_INT_NUMBERS temp;
- int i=1;
- while (elements>_num.elements+i)
- {
- temp.inser_last(*operator[](i));
- i++;
- }
- if(*operator[](i) / *_num[i])
- {
- temp.inser_last(*operator[](i)/ *_num[i]);
- }
- return temp;
- }