Chinaunix首页 | 论坛 | 博客
  • 博客访问: 483285
  • 博文数量: 59
  • 博客积分: 345
  • 博客等级: 二等列兵
  • 技术积分: 1380
  • 用 户 组: 普通用户
  • 注册时间: 2011-06-18 22:44
个人简介

to be myself

文章分类

全部博文(59)

文章存档

2017年(5)

2013年(47)

2012年(3)

2011年(4)

分类: C/C++

2013-03-02 18:25:45

---------------

高精度算法

---------------

说明(以下情况均没做处理) 

1.减数比被减数大

2.除数比被除数大 

3.除数为0



点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. const int MAXSIZE = 100;
  5. void Add(char *str1, char *str2, char *str3);
  6. void Minus(char *str1, char *str2, char *str3);
  7. void Mul(char *str1, char *str2, char *str3);
  8. void Div(char *str1, char *str2, char *str3);
  9.  
  10. int main(void)
  11. {
  12. char str1[MAXSIZE], str2[MAXSIZE], str3[MAXSIZE];
  13. while(scanf("%s %s", str1, str2) == 2)
  14. {
  15. if(strcmp(str1, "0"))
  16. {
  17. memset(str3 , '0', sizeof(str3));
  18. Add(str1, str2, str3);
  19. printf("Add: %sn", str3);
  20. memset(str3 , '0', sizeof(str3));
  21. Minus(str1, str2, str3);
  22. printf("Sub: %sn", str3);
  23. memset(str3 , '0', sizeof(str3));
  24. Mul(str1, str2, str3);
  25. printf("Mul: %sn", str3);
  26. memset(str3 , '0', sizeof(str3));
  27. Div(str1, str2, str3);
  28. printf("Div: %sn", str3);
  29. }
  30. else
  31. {
  32. if (strcmp(str2, "0"))
  33. {
  34. printf("Add: %snSub: -%snMul: 0nDiv: 0n", str2, str2);
  35. }
  36. else
  37. {
  38. printf("Add: 0nSub: 0nMul: 0nDiv: 0n");
  39. }
  40. }
  41. }
  42. return 0;
  43. }
  44.  
  45. void Add(char *str1, char *str2, char *str3)
  46. {
  47. int i, j, i1, i2, tmp, carry;
  48. int len1 = strlen(str1), len2 = strlen(str2);
  49. char ch;
  50. i1 = len1 - 1;
  51. i2 = len2 - 1;
  52. j = carry = 0;
  53. for(; i1>=0 && i2 >= 0; ++j, --i1, --i2)
  54. {
  55. tmp = str1[i1] - '0' + str2[i2] - '0' + carry;
  56. carry = tmp / 10;
  57. str3[j] = tmp % 10 + '0';
  58. }
  59. while(i1 >= 0)
  60. {
  61. tmp = str1[i1--] - '0' + carry;
  62. carry = tmp / 10;
  63. str3[j++] = tmp % 10 + '0';
  64. }
  65. while(i2 >= 0)
  66. {
  67. tmp = str2[i2--] - '0' + carry;
  68. carry = tmp / 10;
  69. str3[j++] = tmp % 10 + '0';
  70. }
  71. if(carry)
  72. {
  73. str3[j++] = carry + '0';
  74. }
  75. str3[j] = '';
  76. for(i=0, --j; i<j; ++i, --j)
  77. {
  78. ch = str3[i];
  79. str3[i] = str3[j];
  80. str3[j] = ch;
  81. }
  82. }
  83.  
  84. void Minus(char *str1, char *str2, char *str3)
  85. {
  86. int i, j, i1, i2, tmp, carry;
  87. int len1 = strlen(str1), len2 = strlen(str2);
  88. char ch;
  89. i1 = len1 - 1;
  90. i2 = len2 - 1;
  91. j = carry = 0;
  92. while(i2 >= 0)
  93. {
  94. tmp = str1[i1] - str2[i2] - carry;
  95. if (tmp < 0)
  96. {
  97. str3[j] = tmp + 10 + '0';
  98. carry = 1;
  99. }
  100. else
  101. {
  102. str3[j] = tmp + '0';
  103. carry = 0;
  104. }
  105. --i1;
  106. --i2;
  107. ++j;
  108. }
  109. while(i1 >= 0)
  110. {
  111. tmp = str1[i1] - '0' - carry;
  112. if (tmp < 0)
  113. {
  114. str3[j] = tmp + 10 + '0';
  115. carry = 1;
  116. }
  117. else
  118. {
  119. str3[j] = tmp + '0';
  120. carry = 0;
  121. }
  122. --i1;
  123. ++j;
  124. }
  125. --j;
  126. while(str3[j] == '0' && j > 0)
  127. {
  128. --j;
  129. }
  130. str3[++j] = '';
  131. for (i=0, --j; i<j; ++i, --j)
  132. {
  133. ch = str3[i];
  134. str3[i] = str3[j];
  135. str3[j] = ch;
  136. }
  137. }
  138.  
  139. void Mul(char *str1, char *str2, char *str3)
  140. {
  141. int i, j, i1, i2, tmp, carry, jj;
  142. int len1 = strlen(str1), len2 = strlen(str2);
  143. char ch;
  144. jj = carry = 0;
  145. for (i1=len1-1; i1>=0; --i1)
  146. {
  147. j = jj;
  148. for (i2=len2-1; i2>=0; --i2,++j)
  149. {
  150. tmp = (str3[j] - '0') + (str1[i1] - '0') * (str2[i2] - '0') + carry;
  151. if (tmp > 9)
  152. {
  153. carry = tmp / 10;
  154. str3[j] = tmp % 10 + '0';
  155. }
  156. else
  157. {
  158. str3[j] = tmp + '0';
  159. carry = 0;
  160. }
  161. }
  162. if (carry)
  163. {
  164. str3[j] = carry + '0';
  165. carry = 0;
  166. ++j;
  167. }
  168. ++jj;
  169. }
  170. --j;
  171. while(str3[j] == '0' && j > 0)
  172. {
  173. --j;
  174. }
  175. str3[++j] = '';
  176. for(i=0, --j; i<j; ++i, --j)
  177. {
  178. ch = str3[i];
  179. str3[i] = str3[j];
  180. str3[j] = ch;
  181. }
  182. }
  183.  
  184. void Div(char *str1, char *str2, char *str3)
  185. {
  186. int i1, i2, i, j, jj, tag, carry, cf, c[MAXSIZE];
  187. int len1 = strlen(str1), len2 = strlen(str2), lend;
  188. char d[MAXSIZE];
  189. memset(c, 0, sizeof(c));
  190. memcpy(d, str1, len2);
  191. lend = len2;
  192. j = 0;
  193. for(i1=len2-1; i1<len1; ++i1)
  194. {
  195. if(lend < len2)
  196. {
  197. d[lend] = str1[i1+1];
  198. c[j] = 0;
  199. ++j;
  200. ++lend;
  201. }
  202. else if(lend == len2)
  203. {
  204. jj = 1;
  205. for(i=0; i<lend; ++i)
  206. {
  207. if(d[i] > str2[i])
  208. {
  209. break;
  210. }
  211. else if(d[i] < str2[i])
  212. {
  213. jj = 0;
  214. break;
  215. }
  216. }
  217. if (0 == jj)
  218. {
  219. d[lend] = str1[i1+1];
  220. c[j] = 0;
  221. ++j;
  222. ++lend;
  223. continue;
  224. }
  225. }
  226. if(1 == jj || lend > len2)
  227. {
  228. cf = jj = 0;
  229. while(d[jj] <= '0' && jj < lend)
  230. {
  231. ++jj;
  232. }
  233. if (lend-jj > len2)
  234. {
  235. cf = 1;
  236. }
  237. else if (lend-jj < len2)
  238. {
  239. cf = 0;
  240. }
  241. else
  242. {
  243. i2 = 0;
  244. cf = 1;
  245. for (i=jj; i<lend; ++i)
  246. {
  247. if (d[i] < str2[i2])
  248. {
  249. cf = 0;
  250. break;
  251. }
  252. else if(d[i] > str2[i2])
  253. {
  254. break;
  255. }
  256. ++i2;
  257. }
  258. }
  259. while(cf)
  260. {
  261. i2 = len2 - 1;
  262. cf = 0;
  263. for(i=lend-1; i>=lend-len2; --i)
  264. {
  265. d[i] = d[i] - str2[i2] + '0';
  266. if(d[i] < '0')
  267. {
  268. d[i] = d[i] + 10;
  269. carry = 1;
  270. --d[i-1];
  271. }
  272. else
  273. {
  274. carry = 0;
  275. }
  276. --i2;
  277. }
  278. ++c[j];
  279. jj = 0;
  280. while(d[jj] <= '0' && jj < lend)
  281. {
  282. ++jj;
  283. }
  284. if(lend-jj > len2)
  285. {
  286. cf = 1;
  287. }
  288. else if(lend-jj < len2)
  289. {
  290. cf = 0;
  291. }
  292. else
  293. {
  294. i2 = 0;
  295. cf =1;
  296. for (i=jj; i<lend; ++i)
  297. {
  298. if(d[i] < str2[i2])
  299. {
  300. cf = 0;
  301. break;
  302. }
  303. else if(d[i] > str2[i2])
  304. {
  305. break;
  306. }
  307. ++i2;
  308. }
  309. }
  310. }
  311. jj = 0;
  312. while(d[jj] <= '0' && jj < lend)
  313. {
  314. ++jj;
  315. }
  316. for(i=0; i<lend-jj; ++i)
  317. {
  318. d[i] = d[i+jj];
  319. }
  320. d[i] = str1[i1+1];
  321. lend = i + 1;
  322. ++j;
  323. }
  324. }
  325. i = tag = 0;
  326. while(0 == c[i])
  327. {
  328. ++i;
  329. }
  330. for(; i<j; ++i, ++tag)
  331. {
  332. str3[tag] = c[i] + '0';
  333. }
  334. str3[tag] = '';
  335. }

2011-05-06 16:08 发表于百度空间,今搬至CU。

阅读(1564) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~