首页 > 代码库 > C语言大数四则运算

C语言大数四则运算

  1. /**/////////////////
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <ctype.h>
  6. /*int cchkdig(char *r)
  7. {
  8. int i=0;
  9. while(r[i]!=‘\0‘)
  10. {
  11. if(isdigit(r[i++])==0)
  12. return (0);
  13. }
  14. return (1);
  15. } */
  16. void del_0(char *r) //去掉整数串表示前面多余的零,最后结果为空串时置为"0"
  17. {
  18. unsigned int lr;
  19. int i=0, j;
  20. lr=strlen(r);
  21. while(r[i]==‘0‘)
  22. ++i;
  23. if(i>0)
  24. {
  25. for(j=0; j<lr-i; ++j)
  26. r[j]=r[j+i];
  27. for(j=lr-i; j<lr; ++j)
  28. {
  29. r[j]=‘\0‘;
  30. }
  31. }
  32. if(r[0]==‘\0‘)
  33. {
  34. r[0]=‘0‘;
  35. }
  36. }
  37. int scmp(char *r, char *u) //比较长度
  38. {
  39. unsigned int lr, lu;
  40. del_0(r);
  41. del_0(u);
  42. lr=strlen(r);
  43. lu=strlen(u);
  44. if(lr>lu)
  45. {
  46. return 1;
  47. }
  48. else if (lr<lu)
  49. {
  50. return -1;
  51. }
  52. return (strcmp(r, u));
  53. }
  54. char *sub(char *r, char *u) //两个串表示数的减法
  55. {
  56. unsigned int i,lr, lu, lp,c=0;
  57. char h,hc;
  58. char *p;
  59. if(scmp(r, u)<0) //r比u大
  60. return NULL;
  61. lr=strlen(r);
  62. lu=strlen(u);
  63. p=(char *)malloc((unsigned int)(lr+1)*sizeof(char));
  64. for(i=0; i<lu; ++i)
  65. {
  66. h=r[lr-i-1]-u[lu-i-1]-c;
  67. if(h<0)
  68. {
  69. c=1;
  70. h=h+10;
  71. }
  72. else
  73. c=0;
  74. p[i]=h+‘0‘;
  75. hc=h+‘0‘;
  76. }
  77. for (i=lu; i<lr; ++i)
  78. {
  79. h=r[lr-i-1]-‘0‘-c;
  80. if(h<0)
  81. {
  82. c=1;
  83. h=h+10;
  84. }
  85. else
  86. c=0;
  87. p[i]=‘0‘+h;
  88. hc=‘0‘+h;
  89. }
  90. p[i]=‘\0‘;
  91. lp=i-1;
  92. while(p[lp]==‘0‘&&lp!=0)
  93. {
  94. p[lp]=‘\0‘;
  95. lp--;
  96. }
  97. for(i=0; i<(lp+1)/2; ++i)
  98. {
  99. hc=p[i];
  100. p[i]=p[lp-i];
  101. p[lp-i]=hc;
  102. }
  103. return (p);
  104. }//end sub()
  105. char *add(char *r, char *u) //两个串表示数的加法
  106. {
  107. unsigned int lr, lu, lp;
  108. int i, h, c=0;
  109. char hc, *p;
  110. lr=strlen(r);
  111. lu=strlen(u);
  112. if(lu>lr)
  113. {
  114. p=r;
  115. r=u;
  116. u=p;
  117. h=lr;
  118. lr=lu;
  119. lu=h;
  120. }
  121. p=(char *)malloc((unsigned int)(lr+2)*sizeof(char));
  122. for(i=0; i<lu; ++i)
  123. {
  124. h=r[lr-i-1]-‘0‘+u[lu-i-1]-‘0‘+c;
  125. if(h>9)
  126. {
  127. c=1;
  128. h=h-10;
  129. }
  130. else
  131. c=0;
  132. p[i]=h+‘0‘;
  133. }
  134. for(i=lu; i<lr; ++i)
  135. {
  136. h=r[lr-i-1]-‘0‘+c;
  137. if(h>9)
  138. {
  139. c=1;
  140. h=h-10;
  141. }
  142. else
  143. c=0;
  144. p[i]=‘0‘+h;
  145. }
  146. if(c>0)
  147. {
  148. p[i]=c+‘0‘;
  149. lp=i;
  150. }
  151. else
  152. lp=i-1;
  153. for(i=lp+1; i<lr+2; ++i)
  154. p[i]=‘\0‘;
  155. for(i=0; i<(lp+1)/2; ++i)
  156. {
  157. hc=p[i];
  158. p[i]=p[lp-i];
  159. p[lp-i]=hc;
  160. }
  161. return (p);
  162. }//end add()
  163. char *mul(char *r, char *u) //两个串表示数的乘法
  164. {
  165. unsigned int lr, lu, lp;
  166. int i, j, c, h;
  167. char *p;
  168. lr=strlen(r);
  169. lu=strlen(u);
  170. p=(char *)malloc((unsigned int)(lr+lu+1)*sizeof(char));
  171. for(i=0; i<lr+lu; ++i)
  172. p[i]=‘0‘;
  173. p[lr+lu]=‘\0‘;
  174. for(i=lr-1; i>=0; --i)
  175. {
  176. c=0;
  177. for(j=lu-1; j>=0; --j)
  178. {
  179. lp=i+j+1;
  180. h=(r[i]-‘0‘)*(u[j]-‘0‘)+p[lp]-‘0‘+c;
  181. c=h/10;
  182. h=h%10;
  183. p[lp]=h+‘0‘;
  184. }
  185. if(c>0)p[i+j+1]=c+‘0‘;
  186. }
  187. del_0(p);
  188. return p;
  189. }//end mul()
  190. char *div(char *u, char *v, int n) //两个串表示数的除法,结果精确到小数点后第n位
  191. {
  192. char *p, *f, *r,*q;
  193. unsigned int i, lu, lv, lr, iw, c, h;
  194. int kh, j;
  195. lu=strlen(u);
  196. lv=strlen(v);
  197. f=(char *)malloc((unsigned int)(lu+n+3)*sizeof(char));
  198. q=(char *)malloc(sizeof(char));
  199. for(i=0; i<lu+n+3; ++i)
  200. f[i]=‘\0‘;
  201. r=(char *)malloc((unsigned int)(lv+2)*sizeof(char));
  202. for(i=0; i<lv+2; ++i)
  203. r[i]=‘\0‘;
  204. for(iw=0; iw<lu+n+2; ++iw)
  205. {
  206. if(iw<lu)
  207. {
  208. del_0(r);
  209. lr=strlen(r);
  210. r[lr]=u[iw];
  211. r[lr+1]=‘\0‘;
  212. }
  213. else if(iw>lu)
  214. {
  215. del_0(r);
  216. q[0]=‘0‘;
  217. if(scmp(r, q)==0)
  218. {
  219. break;
  220. }
  221. lr=strlen(r);
  222. r[lr]=‘0‘;
  223. r[lr+1]=‘\0‘;
  224. }
  225. else
  226. {
  227. f[lu]=‘.‘;
  228. continue;
  229. }
  230. kh=0;
  231. while(scmp(r, v)>=0)
  232. {
  233. p=r;
  234. r=sub(p, v);
  235. ++kh;
  236. }
  237. f[iw]=kh+‘0‘;
  238. }
  239. if(iw==lu+n+2)
  240. {
  241. if(f[lu+n+1]>=‘5‘)
  242. {
  243. f[lu+n+1]=‘\0‘;
  244. c=1;
  245. for(j=lu+n; j>=0; --j)
  246. {
  247. if(c==0)
  248. {
  249. break;
  250. }
  251. if(f[j]==‘.‘)
  252. {
  253. continue;
  254. }
  255. h=f[j]-‘0‘+c;
  256. if(h>9)
  257. {
  258. h=h-10;
  259. c=1;
  260. }
  261. else
  262. c=‘\0‘;
  263. f[j]=h+‘0‘;
  264. }
  265. }
  266. else
  267. f[lu+n+1]=‘\0‘;
  268. }
  269. free(r);
  270. free(p);
  271. q=NULL;
  272. free(q);
  273. del_0(f);
  274. return(f);
  275. }//end div()
  276. /*
  277. //两个串表示数的除法,结果分别用整商与余数表示
  278. char *sdivkr(char *u, char *v, char **rout)
  279. {
  280. char *f, *r;
  281. unsigned int i, lu, lv, lr, iw;
  282. int kh;
  283. lu=strlen(u);
  284. lv=strlen(v);
  285. f=(char *)malloc((unsigned int)(lu+1)*sizeof(char));
  286. for(i=0; i<lu+1; ++i) f[i]=‘\0‘;
  287. r=(char *)malloc((unsigned int)(lv+2)*sizeof(char));
  288. for(i=0; i<lv+2; ++i) r[i]=‘\0‘;
  289. for(iw=0; iw<lu; ++iw)
  290. {
  291. del_0(r);
  292. lr=strlen(r);
  293. r[lr]=u[iw];
  294. r[lr+1]=‘\0‘;
  295. kh=0;
  296. while(scmp(r, v)>=0)
  297. {
  298. r=sub(r, v);
  299. ++kh;
  300. }
  301. f[iw]=kh+‘0‘;
  302. }
  303. del_0(r);
  304. *rout=r;
  305. del_0(f);
  306. return(f);
  307. }//end *sdivkr()
  308. */
  309. /*调用上述函数实现两任意长正整数任意指定精度的算术计算器程序
  310. void main(int argc, char *argv[])
  311. {
  312. char *p, *r;
  313. int n;
  314. if(argc!=4)
  315. {
  316. if(argc!=3)
  317. printf("\n>>\"order n1 op n2\" or n ! ");
  318. exit(0);
  319. }
  320. del_0(argv[1]);
  321. if(cchkdig(argv[1])==0)
  322. {
  323. printf("Input data error, Input again!");
  324. exit(0);
  325. }
  326. del_0(argv[3]);
  327. if(cchkdig(argv[3])==0)
  328. {
  329. printf("Input data error, Input again!");
  330. exit(0);
  331. }
  332. if(strcmp(argv[2], "+")==0)
  333. {
  334. printf("%s", p=add(argv[1], argv[3]));
  335. free(p);
  336. }
  337. else if(strcmp(argv[2], "-")==0)
  338. {
  339. printf("%s", p=sub(argv[1], argv[3]));
  340. free(p);
  341. }
  342. else if(strcmp(argv[2], "*")==0)
  343. {
  344. printf("%s", p=mul(argv[1], argv[3]));
  345. free(p);
  346. }
  347. else if(argv[2][0]==‘/‘ && strlen(argv[2])==1)
  348. {
  349. if(argv[3][0]==‘0‘)
  350. {
  351. printf("error!devided by zero!!\n");
  352. exit(0);
  353. }
  354. p=sdivkr(argv[1], argv[3], &r);
  355. printf("k=%s r=%s", p, r);
  356. free(p);
  357. free(r);
  358. }
  359. else
  360. if(argv[2][0]==‘/‘&&strlen(argv[2])>1)
  361. {
  362. if(argv[3][0]==‘0‘)
  363. {
  364. printf("error!devided by zero!!\n");
  365. exit(0);
  366. }
  367. argv[2][0]=‘\0‘;
  368. del_0(argv[2]);
  369. if(cchkdig(argv[2])==0)
  370. {
  371. printf("Input data error, Input again!");
  372. exit (0);
  373. }
  374. n=atoi(argv[2]);
  375. printf("%s", p=div(argv[1], argv[3], n));
  376. free(p);
  377. }
  378. } */
  379. char a[200000];
  380. int main()
  381. {
  382. //freopen("read.txt", "r", stdin);
  383. int n;
  384. scanf("%d", &n);
  385. while(n--)
  386. {
  387. memset(a, ‘\0‘, sizeof(a));
  388. char b[200] = {"0"};
  389. while(~scanf("%s", a) && a[0] != 0)
  390. {
  391. strcpy(b, add(a, b));
  392. }
  393. printf("%s\n", b);
  394. if(n!=0) printf("\n");
  395. }
  396. return 0;
  397. }



来自为知笔记(Wiz)


附件列表

     

    C语言大数四则运算