/bigint.cpp

https://github.com/swarnaprakash/acm-snippets · C++ · 472 lines · 351 code · 88 blank · 33 comment · 59 complexity · e19781b7cafd7e96e7dd50a0be8dc061 MD5 · raw file

  1. /***********************************************************************************************************************************
  2. ARBITRARY PRECISION ARITHMETIC
  3. written by U.Swarnaprakash
  4. ************************************************************************************************************************************/
  5. #include<cstdio>
  6. #include<iostream>
  7. #include<string>
  8. #include<cstring>
  9. using namespace std;
  10. /************************************************************************************************************************************/
  11. struct bigint
  12. {
  13. char digit[100];
  14. int length;
  15. bigint();
  16. bigint(int);
  17. bigint(long long);
  18. bigint(char *);
  19. bigint(string);
  20. void print();
  21. bigint operator+(bigint);
  22. bigint operator-(bigint);
  23. bigint operator*(bigint);
  24. bigint operator/(int);
  25. bigint operator/(long long);
  26. int operator%(int);
  27. long long operator%(long long);
  28. bool operator==(bigint);
  29. bool operator!=(bigint);
  30. bool operator<=(bigint);
  31. bool operator>(bigint);
  32. bool operator>=(bigint);
  33. bool operator<(bigint);
  34. friend ostream & operator<<(ostream &,bigint);
  35. operator int();
  36. operator long long();
  37. operator string();
  38. };
  39. /************************************************************************************************************************************/
  40. /************************************************************************************************************************************/
  41. bigint::bigint()
  42. {
  43. length=0;
  44. }
  45. /************************************************************************************************************************************/
  46. bigint::bigint(int n)
  47. {
  48. int pos=0;
  49. while(n!=0)
  50. {
  51. digit[pos++]=n%10;
  52. n/=10;
  53. }
  54. length=pos;
  55. }
  56. /************************************************************************************************************************************/
  57. bigint::bigint(long long n)
  58. {
  59. int pos=0;
  60. while(n!=0)
  61. {
  62. digit[pos++]=n%10;
  63. n/=10;
  64. }
  65. length=pos;
  66. }
  67. /************************************************************************************************************************************/
  68. bigint::bigint(char *n)
  69. {
  70. int pos,len;
  71. length=len=strlen(n);
  72. pos=0;
  73. while(len--)
  74. digit[pos++]=n[len]-'0';
  75. for(pos=length-1;pos>=0 && digit[pos]==0;--pos);
  76. length=pos+1;
  77. }
  78. /************************************************************************************************************************************/
  79. bigint::bigint(string n)
  80. {
  81. int pos,len;
  82. length=len=n.size();
  83. pos=0;
  84. while(len--)
  85. digit[pos++]=n[len]-'0';
  86. for(pos=length-1;pos>=0 && digit[pos]==0;--pos);
  87. length=pos+1;
  88. }
  89. /************************************************************************************************************************************/
  90. void bigint::print()
  91. {
  92. int i;
  93. if(length==0)
  94. putchar('0');
  95. for(i=length-1;i>=0;--i)
  96. putchar(digit[i]+'0');
  97. }
  98. /************************************************************************************************************************************/
  99. bigint bigint::operator+(bigint x)
  100. {
  101. int i,carry,d;
  102. bigint aaa,bbb,result;
  103. if(length>x.length)
  104. {
  105. aaa=*this;
  106. bbb=x;
  107. }
  108. else
  109. {
  110. aaa=x;
  111. bbb=*this;
  112. }
  113. carry=0;
  114. for(i=0;i<bbb.length;++i)
  115. {
  116. d=aaa.digit[i]+bbb.digit[i]+carry;
  117. result.digit[i]=d%10;
  118. carry=d/10;
  119. }
  120. for(;i<aaa.length;++i)
  121. {
  122. d=aaa.digit[i]+carry;
  123. result.digit[i]=d%10;
  124. carry=d/10;
  125. }
  126. if(carry!=0)
  127. result.digit[i++]=carry;
  128. result.length=i;
  129. return result;
  130. }
  131. /************************************************************************************************************************************/
  132. bigint bigint::operator-(bigint x)
  133. {
  134. int i,borrow,d;
  135. bigint result;
  136. borrow=0;
  137. for(i=0;i<x.length;++i)
  138. {
  139. d=digit[i]-x.digit[i]-borrow;
  140. if(d<0)
  141. {
  142. result.digit[i]=d+10;
  143. borrow=1;
  144. }
  145. else
  146. {
  147. result.digit[i]=d;
  148. borrow=0;
  149. }
  150. }
  151. for(;i<length;++i)
  152. {
  153. d=digit[i]-borrow;
  154. if(d<0)
  155. {
  156. result.digit[i]=d+10;
  157. borrow=1;
  158. }
  159. else
  160. {
  161. result.digit[i]=d;
  162. borrow=0;
  163. }
  164. }
  165. for(i=length-1;i>=0 && result.digit[i]==0;--i);
  166. result.length=i+1;
  167. return result;
  168. }
  169. /************************************************************************************************************************************/
  170. bigint bigint::operator*(bigint x)
  171. {
  172. int r,i,j,hi,lo,carry,tmp;
  173. bigint result;
  174. r=length+x.length-1;
  175. carry=0;
  176. for(i=0;i<r;++i)
  177. {
  178. lo=0;hi=i+1;
  179. if(hi>length)
  180. hi=length;
  181. if((i-lo)>=x.length)
  182. lo=i-x.length+1;
  183. tmp=carry;
  184. for(j=lo;j<hi;++j)
  185. tmp+=digit[j]*x.digit[i-j];
  186. result.digit[i]=tmp%10;
  187. carry=tmp/10;
  188. }
  189. if(carry!=0)
  190. result.digit[i++]=carry;
  191. result.length=i;
  192. for(i=result.length-1;i>=0 && result.digit[i]==0;--i);
  193. result.length=i+1;
  194. return result;
  195. }
  196. /************************************************************************************************************************************/
  197. bigint bigint::operator/(int x)
  198. {
  199. bigint result;
  200. int i;
  201. int tmp,n;
  202. n=0;
  203. for(i=length-1;i>=0;--i)
  204. {
  205. tmp=n*10+digit[i];
  206. if(tmp>=x)
  207. break;
  208. n=tmp;
  209. }
  210. result.length=i+1;
  211. for(;i>=0;--i)
  212. {
  213. n*=10;
  214. n+=digit[i];
  215. result.digit[i]=n/x;
  216. n%=x;
  217. }
  218. return result;
  219. }
  220. /************************************************************************************************************************************/
  221. bigint bigint::operator/(long long x)
  222. {
  223. bigint result;
  224. int i;
  225. long long tmp,n;
  226. n=0;
  227. for(i=length-1;i>=0;--i)
  228. {
  229. tmp=n*10+digit[i];
  230. if(tmp>=x)
  231. break;
  232. n=tmp;
  233. }
  234. result.length=i+1;
  235. for(;i>=0;--i)
  236. {
  237. n*=10;
  238. n+=digit[i];
  239. result.digit[i]=n/x;
  240. n%=x;
  241. }
  242. return result;
  243. }
  244. /************************************************************************************************************************************/
  245. int bigint::operator%(int x)
  246. {
  247. int result=0;
  248. int i;
  249. for(i=length-1;i>=0;--i)
  250. result=(result*10+digit[i])%x;
  251. return result;
  252. }
  253. /************************************************************************************************************************************/
  254. long long bigint::operator%(long long x)
  255. {
  256. long long result=0;
  257. int i;
  258. for(i=length-1;i>=0;--i)
  259. result=(result*10+digit[i])%x;
  260. return result;
  261. }
  262. /************************************************************************************************************************************/
  263. bool bigint::operator==(bigint x)
  264. {
  265. int i;
  266. if(length!=x.length)
  267. return false;
  268. for(i=0;i<length;++i)
  269. if(digit[i]!=x.digit[i])
  270. return false;
  271. return true;
  272. }
  273. /************************************************************************************************************************************/
  274. bool bigint::operator!=(bigint x)
  275. {
  276. int i;
  277. if(length!=x.length)
  278. return true;
  279. for(i=0;i<length;++i)
  280. if(digit[i]!=x.digit[i])
  281. return true;
  282. return false;
  283. }
  284. /************************************************************************************************************************************/
  285. bool bigint::operator<=(bigint x)
  286. {
  287. int i;
  288. if(length!=x.length)
  289. return length<x.length;
  290. for(i=length-1;i>=0;--i)
  291. if(digit[i]!=x.digit[i])
  292. return digit[i]<x.digit[i];
  293. return true;
  294. }
  295. /************************************************************************************************************************************/
  296. bool bigint::operator>(bigint x)
  297. {
  298. int i;
  299. if(length!=x.length)
  300. return length>x.length;
  301. for(i=length-1;i>=0;--i)
  302. if(digit[i]!=x.digit[i])
  303. return digit[i]>x.digit[i];
  304. return false;
  305. }
  306. /************************************************************************************************************************************/
  307. bool bigint::operator>=(bigint x)
  308. {
  309. int i;
  310. if(length!=x.length)
  311. return length>x.length;
  312. for(i=length-1;i>=0;--i)
  313. if(digit[i]!=x.digit[i])
  314. return digit[i]>x.digit[i];
  315. return true;
  316. }
  317. /************************************************************************************************************************************/
  318. bool bigint::operator<(bigint x)
  319. {
  320. int i;
  321. if(length!=x.length)
  322. return length<x.length;
  323. for(i=length-1;i>=0;--i)
  324. if(digit[i]!=x.digit[i])
  325. return digit[i]<x.digit[i];
  326. return false;
  327. }
  328. /************************************************************************************************************************************/
  329. ostream & operator<<(ostream &bout,bigint x)
  330. {
  331. int i;
  332. if(x.length==0)
  333. bout<<0;
  334. for(i=x.length-1;i>=0;--i)
  335. bout<<(char)(x.digit[i]+'0');
  336. return bout;
  337. }
  338. /************************************************************************************************************************************/
  339. bigint::operator int()
  340. {
  341. int result=0;
  342. int i;
  343. for(i=length-1;i>=0;--i)
  344. {
  345. result*=10;
  346. result+=digit[i];
  347. }
  348. return result;
  349. }
  350. /************************************************************************************************************************************/
  351. bigint::operator long long()
  352. {
  353. long long result=0;
  354. int i;
  355. for(i=length-1;i>=0;--i)
  356. {
  357. result*=10;
  358. result+=digit[i];
  359. }
  360. return result;
  361. }
  362. /************************************************************************************************************************************/
  363. bigint::operator string()
  364. {
  365. string result;
  366. int i;
  367. for(i=length-1;i>=0;--i)
  368. result+=digit[i]+'0';
  369. return result;
  370. }
  371. /************************************************************************************************************************************/
  372. int main()
  373. {
  374. string x,y;
  375. long long n;
  376. while(cin>>x>>y)
  377. {
  378. //bigint b(y);
  379. cout<<bigint(x)+bigint(y)<<endl;
  380. }
  381. return 0;
  382. }
  383. /************************************************************************************************************************************/