fork download
  1. #include <stdio.h>
  2. #include <string>
  3. #include <stdlib.h>
  4. #include <iostream>
  5. using namespace std;
  6. void addi(char *s,int size,int pos)
  7. {
  8. char *sum;
  9. int l1=pos,l2=size-pos-1;
  10. int maxl=(l1>=l2)?l1:l2;
  11. sum = (char*)malloc((maxl+1)*sizeof(char));
  12.  
  13. int c=0,k=maxl,m,n;
  14. for(m=pos-1,n=size-1;m>=0&&n>pos;m--,n--)
  15. {
  16. int a=s[m]-'0',b=s[n]-'0',ts;
  17. ts=a+b+c;
  18. if(ts>=10)
  19. {
  20. c=1;
  21. }
  22. else c=0;
  23. sum[k--]=ts%10;
  24. //printf("a=%d b=%d c=%d sum[%d]=%d\n",a,b,c,k+1,sum[k+1]);
  25. }
  26. //printf("m=%d n=%d\n",m,n);
  27.  
  28. if(m!=-1)
  29. {
  30. while(m>=0)
  31. {
  32. int a=s[m]-'0',b=0,ts=a+b+c;
  33. if(ts>=10) c=1;
  34. else c=0;
  35. sum[k--]=ts%10;
  36. //printf("a=%d b=%d c=%d sum[%d]=%d\n",a,b,c,k+1,sum[k+1]);
  37. m--;
  38. }
  39. }
  40. else if(n!=pos)
  41. {
  42. while(n>pos)
  43. {
  44. int a=0,b=s[n]-'0',ts=a+b+c;
  45. if(ts>=10) c=1;
  46. else c=0;
  47. sum[k--]=ts%10;
  48. //printf("a=%d b=%d c=%d sum[%d]=%d\n",a,b,c,k+1,sum[k+1]);
  49. n--;
  50. }
  51. }
  52. if(m==-1&&n==pos) if(c==1) sum[k--]=c;
  53. //printf("k=%d\n",k);
  54. int l3=maxl-k,sp1=0,sp2=0,sp3=0,sp;
  55. //printf("l1=%d l2=%d l3=%d\n",l1,l2,l3);
  56. if(l1>=l2+1)
  57. {
  58. if(l2+1>=l3)
  59. {
  60. sp1=0;sp2=l1-l2-1;sp3=l1-l3;sp=l1;
  61. }
  62. else if(l1>l3)
  63. {
  64. sp1=0;sp2=l1-l2-1;sp3=l1-l3;sp=l1;
  65. }
  66. else
  67. {
  68. sp1=l3-l1;sp2=l3-l2-1;sp3=0;sp=l3;
  69. }
  70.  
  71. }
  72. else
  73. {
  74. if(l1>=l3)
  75. {
  76. sp1=l2+1-l1;sp2=0;sp3=l2+1-l3;sp=l2+1;
  77. //printf("sp=%d sp1=%d sp2=%d sp3=%d\n",sp,sp1,sp2,sp3);
  78. //printf("yes\n");
  79. }
  80. else if(l2+1>=l3)
  81. {
  82. sp1=l2+1-l1;sp2=0;sp3=l2+1-l3;sp=l2+1;
  83. //printf("2bbnd\n");
  84. }
  85. else
  86. {
  87. sp1=l3-l1;sp2=l3-l2-1;sp3=0;sp=l3;
  88. //printf("thrid\n");
  89. }
  90.  
  91. }
  92. //printf("sp=%d sp1=%d sp2=%d sp3=%d\n",sp,sp1,sp2,sp3);
  93. for(int i=0;i<sp1;i++) {printf(" ");}
  94. for(int i=0;i<l1;i++)
  95. {
  96. printf("%c",s[i]);
  97. }
  98. printf("\n");
  99. for(int i=0;i<sp2;i++)
  100. {
  101. printf(" ");
  102. }
  103. printf("+");
  104. int g=pos+1;
  105. for(int i=0;i<l2;i++)
  106. {
  107. printf("%c",s[g++]);
  108.  
  109. }
  110. printf("\n");
  111. if(l3>=l2+1)
  112. {
  113. sp=l3;
  114. }
  115. else
  116. {
  117. sp=l2+1;
  118. }
  119. for(int i=0;i<l1-sp;i++)
  120. {
  121. printf(" ");
  122. }
  123. for(int i=0;i<sp;i++)
  124. {
  125. printf("-");
  126. }
  127. printf("\n");
  128. for(int i=0;i<sp3;i++) printf(" ");
  129. for(int i=k+1;i<maxl+1;i++) printf("%d",sum[i]);
  130. printf("\n");
  131.  
  132.  
  133. }
  134. void sub(char *s,int size,int pos)
  135. {
  136. char *sum;
  137. int l1=pos,l2=size-pos-1;
  138. int maxl=(l1>=l2)?l1:l2;
  139. sum = (char*)malloc((maxl)*sizeof(char));
  140.  
  141. int c=0,k=maxl-1,m,n;
  142. for(m=pos-1,n=size-1;m>=0&&n>pos;m--,n--)
  143. {
  144. int a=s[m]-'0',b=s[n]-'0';
  145. if(a+c>=b) {sum[k--]=a-b+c;c=0;}
  146. else
  147. {
  148. sum[k--]=a+c-b+10;
  149. c=-1;
  150. }
  151. //printf("a=%d b=%d c=%d sum[%d]=%d\n",a,b,c,k+1,sum[k+1]);
  152. }
  153. //printf("m=%d n=%d\n",m,n);
  154.  
  155. if(m!=-1)
  156. {
  157. while(m>=0)
  158. {
  159. int a=s[m]-'0',b=0;
  160. if(a+c>=b) {sum[k--]=a-b+c;c=0;}
  161. else
  162. {
  163. sum[k--]=a+c-b+10;
  164. c=-1;
  165. }
  166. //printf("a=%d b=%d c=%d sum[%d]=%d\n",a,b,c,k+1,sum[k+1]);
  167. m--;
  168. }
  169. }
  170. //if(m==-1&&n==pos) if(c==1) sum[k--]=c;
  171. for(int i=0;i<maxl;i++) if(sum[i]) { k=i;break;}
  172. //printf("k=%d\n",k);
  173. int l3=maxl-k,sp1=0,sp2=0,sp3=0,sp;
  174. if(l1>=l2+1)
  175. {
  176. if(l2+1>=l3)
  177. {
  178. sp1=0;sp2=l1-l2-1;sp3=l1-l3;sp=l1;
  179. }
  180. else if(l1>l3)
  181. {
  182. sp1=0;sp2=l1-l2-1;sp3=l1-l3;sp=l1;
  183. }
  184. else
  185. {
  186. sp1=l3-l1;sp2=l3-l2-1;sp3=0;sp=l3;
  187. }
  188.  
  189. }
  190. else
  191. {
  192. if(l1>=l3)
  193. {
  194. sp1=l2+1-l1;sp2=0;sp3=l2+1-l3;sp=l2+1;
  195. }
  196. else if(l2+1>=l3)
  197. {
  198. sp1=l2+1-l1;sp2=0;sp3=l2+1-l3;sp=l2+1;
  199. }
  200. else
  201. {
  202. sp1=l3-l1;sp2=l3-l2-1;sp3=0;sp=l3;
  203. }
  204.  
  205. }
  206. //printf("sp=%d sp1=%d sp2=%d sp3=%d\n",sp,sp1,sp2,sp3);
  207. for(int i=0;i<sp1;i++) {printf(" ");}
  208. for(int i=0;i<l1;i++)
  209. {
  210. printf("%c",s[i]);
  211. }
  212. printf("\n");
  213. for(int i=0;i<sp2;i++)
  214. {
  215. printf(" ");
  216. }
  217. printf("-");
  218. int g=pos+1;
  219. for(int i=0;i<l2;i++)
  220. {
  221. printf("%c",s[g++]);
  222.  
  223. }
  224. printf("\n");
  225. if(l3>=l2+1)
  226. {
  227. sp=l3;
  228. }
  229. else
  230. {
  231. sp=l2+1;
  232. }
  233. for(int i=0;i<l1-sp;i++)
  234. {
  235. printf(" ");
  236. }
  237. for(int i=0;i<sp;i++)
  238. {
  239. printf("-");
  240. }
  241. printf("\n");
  242. for(int i=0;i<sp3;i++) printf(" ");
  243. for(int i=k;i<maxl;i++) printf("%d",sum[i]);
  244. printf("\n");
  245.  
  246. }
  247. void mult(char *s,int size,int pos)
  248. {
  249. int l1=pos,l2=size-pos-1;
  250. char **sum,*product;
  251. //printf("mult\n");
  252. sum=(char**)malloc(l2*sizeof(char*));
  253. int *len=(int*) malloc((l2)*sizeof(int));
  254. for(int i=0;i<l2;i++) len[i]=0;
  255. //printf("adf\n");
  256. product=(char*)malloc((l1+l2)*sizeof(char));
  257. for(int i=0;i<l2+l1;i++) product[i]=0;
  258. //printf("pr0=0 sum[0][0]\n");
  259. for(int i=0;i<l2;i++)
  260. {
  261. //printf("int\n");
  262. sum[i]=(char*) malloc((l1+1)*sizeof(char));
  263. sum[i][0]='0';
  264. //printf("int1\n");
  265. }
  266. //printf("sumi0=0\n");
  267. int row=0;
  268. for(int i=size-1;i>pos;i--,row++)
  269. {
  270. int b=s[i]-'0',c=0;
  271. int col=l1;
  272. //printf("innerlop\n");
  273. for(int j=pos-1;j>=0;j--,col--)
  274. {
  275. int a=s[j]-'0';
  276. int pr=a*b+c;
  277. if(pr>=10)
  278. {
  279. //printf("befpr>10 i=%d j=%d row=%d col=%d\n",i,j,row,col);
  280. sum[row][col]=pr%10;
  281. c=pr/10;
  282. //printf("aftpr>10 i=%d j=%d row=%d col=%d\n sum=%d",i,j,row,col,sum[row][col]);
  283. }
  284. else
  285. {
  286. //printf("befpr<10 i=%d j=%d row=%d col=%d\n",i,j,row,col);
  287. sum[row][col]=pr;
  288. c=0;
  289. //printf("aftpr<10 i=%d j=%d row=%d col=%d\n sum=%d",i,j,row,col,sum[row][col]);
  290. }
  291.  
  292. }
  293. sum[row][col]=c;
  294. if(!c)
  295. {
  296. len[row]=l1;
  297. }
  298. else
  299. {
  300. len[row]=l1+1;
  301. }
  302. if(!b) len[row]=1;
  303. }
  304.  
  305. //for(int i=0;i<l2;i++) printf("len[%d]=%d\n",i,len[i]);
  306. int car=0,m=l2+l1-1,n=0,temp=0;
  307. for(int n=l1;n>=0;n--)
  308. {
  309. int i=0,k=n;
  310. temp=0;
  311. while(i<l2&&k<l1+1)
  312. {
  313. temp+=sum[i++][k++];
  314. }
  315. temp+=car;
  316. if(temp>=10)
  317. {
  318. product[m]=(temp)%10;
  319. car=temp/10;
  320. m--;
  321. }
  322. else
  323. {
  324. product[m]=(temp);
  325. car=0;
  326. m--;
  327. }
  328. //printf("product[%d]=%d\n",m+1,product[m+1]);
  329. }
  330. //printf("m=%d n=%d\n",m,n);
  331. for(int n=1;n<l2;n++)
  332. {
  333. int i=n,k=0;
  334. temp=0;
  335. while(i<l2&&k<l1+1)
  336. {
  337. temp+=sum[i++][k++];
  338. }
  339. temp+=car;
  340. if(temp>=10)
  341. {
  342. product[m]=temp%10;
  343. car=temp/10;
  344. m--;
  345. }
  346. else
  347. {
  348. product[m]=temp;
  349. car=0;m--;
  350. }
  351. //printf("product[%d]=%d\n",m+1,product[m+1]);
  352. }
  353. product[m]=car;
  354. int prlen;
  355. if(product[0]) prlen=l2+l1;
  356. else prlen=l2+l1-1;
  357. //printf("m=%d n=%d prlen=%d l1=%d l2=%d\n",m,n,prlen,l1,l2);
  358. int max=prlen;
  359. if(prlen<l2+1) max=l2+1;
  360. for(int i=0;i<max-l1;i++)
  361. {
  362. printf(" ");
  363. }
  364. for(int i=0;i<l1;i++)
  365. {
  366. printf("%c",s[i]);
  367. }
  368. printf("\n");
  369. for(int i=0;i<max-l2-1;i++)
  370. {
  371. printf(" ");
  372. }
  373. for(int i=pos;i<size;i++)
  374. {
  375. printf("%c",s[i]);
  376. }
  377. printf("\n");
  378. if(len[0]>=l2+1)
  379. {
  380. for(int i=0;i<max-len[0];i++)
  381. {
  382. printf(" ");
  383. }
  384. for(int i=0;i<len[0];i++)
  385. {
  386. printf("-");
  387. }
  388. }
  389. else
  390. {
  391. for(int i=0;i<max-l2-1;i++)
  392. {
  393. printf(" ");
  394. }
  395. for(int i=0;i<l2+1;i++)
  396. {
  397. printf("-");
  398. }
  399.  
  400. }
  401. printf("\n");
  402. for(int i=0;i<l2;i++)
  403. {
  404. //printf("as i=%d len[i]=%d j=%d l1+1=%d",i,len[i],l1-len[i]+1,l1+1);
  405. for(int j=0;j<max-len[i]-i;j++)
  406. {
  407. printf(" ");
  408. }
  409. //printf("i=%d len[i]=%d j=%d l1+1=%d",i,len[i],l1-len[i]+1,l1+1);
  410. for(int j=l1-len[i]+1;j<l1+1;j++)
  411. {
  412. //printf("ai=%d j=%d",i,j);
  413. printf("%d",sum[i][j]);
  414. }
  415. printf("\n");
  416. }
  417. for(int i=0;i<max-prlen;i++)
  418. {
  419. printf(" ");
  420. }
  421. for(int i=0;i<prlen;i++)
  422. {
  423. printf("-");
  424. }
  425. printf("\n");
  426. for(int i=0;i<max-prlen;i++)
  427. {
  428. printf(" ");
  429. }
  430. for(int i=l1+l2-prlen;i<l1+l2;i++)
  431. {
  432. printf("%d",product[i]);
  433. }
  434. printf("\n");
  435.  
  436. }
  437. int main()
  438. {
  439. int t;
  440. scanf("%d",&t);
  441. for(int i=0;i<t;i++)
  442. {
  443. char s[1001];
  444. scanf("%s",s);
  445. int op=0,pos;
  446. int a,b,j;
  447. for(j=0;s[j]!='\0';j++)
  448. {
  449. if(s[j]=='+')
  450. {
  451. //printf("addi\n");
  452. op=1;
  453. pos=j;
  454. }
  455. else if(s[j]=='-')
  456. {
  457. //printf("sub\n");
  458. op=2;
  459. pos=j;
  460. }
  461. else if(s[j]=='*')
  462. {
  463. //printf("mult\n");
  464. op=3;
  465. pos=j;
  466. }
  467. }
  468. if(op==1)
  469. {
  470. addi(s,j,pos);
  471. printf("\n");
  472.  
  473. }
  474. else if(op==2)
  475. {
  476. sub(s,j,pos);
  477. printf("\n");
  478. }
  479. else if(op==3)
  480. {
  481. mult(s,j,pos);
  482. printf("\n");
  483. }
  484.  
  485. }
  486. }
  487.  
Success #stdin #stdout 0s 3468KB
stdin
4
12345+67890
324-111
325*4405
1234*4
stdout
 12345
+67890
------
 80235

 324
-111
----
 213

    325
  *4405
  -----
   1625
     0
 1300
1300
-------
1431625

1234
  *4
----
4936
----
4936