• 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]!='')
    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]='';
    30. }
    31. }
    32. if(r[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]='';
    91. lp=i-1;
    92. while(p[lp]=='0'&&lp!=0)
    93. {
    94. p[lp]='';
    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]='';
    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]='';
    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]='';
    201. r=(char *)malloc((unsigned int)(lv+2)*sizeof(char));
    202. for(i=0; i<lv+2; ++i)
    203. r[i]='';
    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]='';
    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]='';
    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]='';
    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='';
    263. f[j]=h+'0';
    264. }
    265. }
    266. else
    267. f[lu+n+1]='';
    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]='';
    287. r=(char *)malloc((unsigned int)(lv+2)*sizeof(char));
    288. for(i=0; i<lv+2; ++i) r[i]='';
    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]='';
    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(" >>"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!! ");
    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!! ");
    365. exit(0);
    366. }
    367. argv[2][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, '', 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 ", b);
    394. if(n!=0) printf(" ");
    395. }
    396. return 0;
    397. }





    附件列表

    • 相关阅读:
      [微软官方]SQLSERVER的兼容级别
      使用 OPENJSON 分析和转换 JSON 数据 (SQL Server)
      WPF 解决TreeViewItem上为IsMouseOver 时 父级Item也会 受影响
      依赖注入
      关于编译告警 C4819 的完整解决方案
      你想知道的 std::vector::push_back 和 std::vector::emplace_back
      如何使用 Dump 文件?
      关于 PDB 文件你需要知道什么?
      图解哈希表及其原理
      C++ 中的虚函数表及虚函数执行原理
    • 原文地址:https://www.cnblogs.com/sober-reflection/p/1bcdc370a0830eb0727da1c9ab766cbf.html
    Copyright © 2020-2023  润新知