PageRenderTime 51ms CodeModel.GetById 22ms RepoModel.GetById 1ms app.codeStats 0ms

/c++/dynamic array/source/BIG_INT_NUMBERS.CPP

https://bitbucket.org/boria8/c-works
C++ | 279 lines | 215 code | 64 blank | 0 comment | 32 complexity | 8200ec05d6d3bba8ebe0d09443430bbc MD5 | raw file
  1. #include <iostream>
  2. #include <stdio.h>
  3. #include "string.h"
  4. #include "darray.h"
  5. #include "math.h"
  6. #include "big_integer_numbers.h"
  7. #define IF_RETURN(expression,ret) if(expression) {return ret;}
  8. BIG_INT_NUMBERS::BIG_INT_NUMBERS(char *_str):darray(strlen(_str)+1)
  9. {
  10. int point=0;
  11. chek_if_valid(_str,&point);
  12. int i_bef_dot=(int)strlen(_str)-point+1;
  13. if(point==0)
  14. {
  15. i_bef_dot=0;
  16. }
  17. for(int i=0;i<((int)strlen(_str)-i_bef_dot);i++)
  18. {
  19. inser_last(*(_str+i)-'0');
  20. }
  21. char* str=new char[((int)strlen(_str))-i_bef_dot+1];
  22. memcpy(str,_str,((int)strlen(_str))-i_bef_dot);
  23. *(str+(int)strlen(_str)-i_bef_dot+1)='\0';
  24. big_num=str;
  25. cout<<"your number is"<<str<<endl;
  26. }
  27. BIG_INT_NUMBERS:: BIG_INT_NUMBERS(int _num)
  28. {
  29. char _str[100];
  30. int point=0;
  31. sprintf(_str,"%d",_num);
  32. chek_if_valid(_str,&point);
  33. for(int i=0;i<(int)strlen(_str);i++)
  34. {
  35. inser_last(*(_str+i)-'0');
  36. }
  37. char* str=new char[strlen(_str)+1];
  38. strcpy(str,_str);
  39. big_num=str;
  40. }
  41. const int* BIG_INT_NUMBERS::operator[](const int& _index)const
  42. {
  43. if(elements<_index)
  44. {
  45. return 0;
  46. }
  47. return *(array+_index-1);
  48. }
  49. ostream& operator<<(ostream& os,const BIG_INT_NUMBERS& _num)
  50. {
  51. if (! _num.get_size())
  52. {
  53. return os<<endl<<"you don't have number"<<endl;
  54. }
  55. for(int i=0;i<_num.get_size();i++)
  56. {
  57. cout<<*_num[i+1];
  58. }
  59. return os<<endl<<"table of your elements"<<endl;
  60. }
  61. BIG_INT_NUMBERS BIG_INT_NUMBERS::operator+(const BIG_INT_NUMBERS& _num)const
  62. {
  63. BIG_INT_NUMBERS temp;
  64. int i=0;
  65. int carry=0;
  66. temp.inser_last((*operator[](elements-i)+*_num[_num.elements-i])%10);
  67. carry=(*operator[](elements-i)+*_num[_num.elements-i])/10;
  68. i++;
  69. while (1)
  70. {
  71. if(((elements-i)==0)&&((_num.elements-i)==0))
  72. {
  73. if (carry)
  74. {
  75. temp.insert_element_bef(i,carry);
  76. }
  77. char* str=new char[elements+1];
  78. temp.copy_to_str(str);
  79. return temp;
  80. }
  81. else if((elements-i!=0)&&((_num.elements-i)!=0))
  82. {
  83. temp.insert_element_bef(i,((*operator[](elements-i))+(*_num[_num.elements-i])+carry)%10);
  84. carry=(*operator[](elements-i)+*_num[_num.elements-i]+carry)/10;
  85. i++;
  86. }
  87. else if(((elements-i)!=0))
  88. {
  89. temp.insert_element_bef(i,(*operator[](elements-i)+carry)%10);
  90. carry=(*operator[](elements-i)+carry)/10;
  91. i++;
  92. }
  93. else if(((_num.elements-i)!=0))
  94. {
  95. temp.insert_element_bef(i,(*_num[_num.elements-i]+carry)%10);
  96. carry=(*_num[_num.elements-i]+carry)/10;
  97. carry=0;
  98. i++;
  99. }
  100. }
  101. }
  102. BIG_INT_NUMBERS BIG_INT_NUMBERS::operator-(const BIG_INT_NUMBERS& _num)const
  103. {
  104. BIG_INT_NUMBERS temp;
  105. int i=0;
  106. int carry=0;
  107. if((*operator[](elements-i)-*_num[elements-i]-carry)>0)
  108. {
  109. temp.inser_last(*operator[](elements-i)-*_num[elements-i]-carry);
  110. carry=0;
  111. i++;
  112. }
  113. else if (((*operator[](elements-i)-*_num[elements-i]-carry)<0))
  114. {
  115. temp.inser_last(*operator[](elements-i)-*_num[elements-i]+10);
  116. carry=1;
  117. i++;
  118. }
  119. else
  120. {
  121. temp.inser_last(0);
  122. i++;
  123. carry=0;
  124. }
  125. while (1)
  126. {
  127. if((elements-i==0)&&(_num.elements-i==0))
  128. {
  129. if (carry)
  130. {
  131. temp.insert_element_bef(i,carry);
  132. }
  133. char* str=new char[elements+1];
  134. temp.copy_to_str(str);
  135. return temp;
  136. }
  137. else if((elements-i!=0)&&(_num.elements-i!=0))
  138. {
  139. if((*operator[](elements-i)-*_num[elements-i]-carry)>0)
  140. {
  141. temp.insert_element_bef(i,*operator[](elements-i)-*_num[elements-i]-carry);
  142. carry=0;
  143. i++;
  144. }
  145. else if (((*operator[](elements-i)-*_num[elements-i]-carry)<0))
  146. {
  147. temp.insert_element_bef(i,*operator[](elements-i)-*_num[elements-i]+10);
  148. carry=1;
  149. i++;
  150. }
  151. else
  152. {
  153. temp.insert_element_bef(i,0);
  154. i++;
  155. carry=0;
  156. }
  157. }
  158. else if((elements-i!=0))
  159. {
  160. temp.insert_element_bef(i,(*operator[](elements-i)+carry));
  161. carry=0;
  162. i++;
  163. }
  164. else
  165. {
  166. temp.insert_element_bef(i,0);
  167. i++;
  168. }
  169. }
  170. }
  171. BIG_INT_NUMBERS BIG_INT_NUMBERS::operator*(const BIG_INT_NUMBERS& _num)const
  172. {
  173. BIG_INT_NUMBERS temp2;
  174. int i=0;
  175. while(_num.elements>=i)
  176. {
  177. int j=0;
  178. while(elements>j)
  179. {
  180. BIG_INT_NUMBERS temp1((int)(pow(10,i)*(*_num[elements-i])*(*operator[](elements-j))));
  181. temp2=temp2+temp1;
  182. cout<<temp2<<endl;
  183. j++;
  184. }
  185. i++;
  186. }
  187. return temp2;
  188. }
  189. const BIG_INT_NUMBERS& BIG_INT_NUMBERS::operator=(const BIG_INT_NUMBERS& _num)
  190. {
  191. remove_and_delete_all();
  192. delete[] big_num;
  193. big_num=new char[strlen(_num.big_num)];
  194. strcpy(big_num,_num.big_num);
  195. for(int i=1;i<_num.elements+1;i++)
  196. {
  197. inser_last(*_num[i]);
  198. }
  199. return *this;
  200. }
  201. BIG_INT_NUMBERS BIG_INT_NUMBERS::operator/(const BIG_INT_NUMBERS& _num)const
  202. {
  203. BIG_INT_NUMBERS temp;
  204. int i=1;
  205. while (elements>_num.elements+i)
  206. {
  207. temp.inser_last(*operator[](i));
  208. i++;
  209. }
  210. if(*operator[](i) / *_num[i])
  211. {
  212. temp.inser_last(*operator[](i)/ *_num[i]);
  213. }
  214. return temp;
  215. }