整理大整数加减乘除C版.docx
- 文档编号:26203219
- 上传时间:2023-06-17
- 格式:DOCX
- 页数:11
- 大小:30.28KB
整理大整数加减乘除C版.docx
《整理大整数加减乘除C版.docx》由会员分享,可在线阅读,更多相关《整理大整数加减乘除C版.docx(11页珍藏版)》请在冰豆网上搜索。
整理大整数加减乘除C版
大整数加减乘除C版
编辑整理:
尊敬的读者朋友们:
这里是精品文档编辑中心,本文档内容是由我和我的同事精心编辑整理后发布的,发布之前我们对文中内容进行仔细校对,但是难免会有疏漏的地方,但是任然希望(大整数加减乘除C版)的内容能够给您的工作和学习带来便利。
同时也真诚的希望收到您的建议和反馈,这将是我们进步的源泉,前进的动力。
本文可编辑可修改,如果觉得对您有帮助请收藏以便随时查阅,最后祝您生活愉快业绩进步,以下为大整数加减乘除C版的全部内容。
大整数加减乘除C++版
1.#include h〉 2.#include h> 3. 4.#define MAX_DIGIT 500 5. 6.//大数运算: 加法 7.int Multiply(int *a,int *b,int *&result); 8.//大数运算: 乘法 9.int Add(int *a,int *b,int *&result); 10.//大数运算: 减法 11.int Sub(int *a,int *b,int *&result); 12. 13.//逐位调整大数,如result为11 9 22 —3 -2调整为: 1 0 3 9 —3,然后再对符号提升到最高位: 9 9 6 0 2。 。 。 ..。 -1 14.//表示大数的值为—20699 15.void AjustEncodeArray(int *&result,unsigned int iMaxNum); 16. 17.//输出大数 18.void PrintBigNum(int *result); 19. 20.//把个位在高位的字符数组转为个位在低位(下标0)的整型数组 21.void CArray2revDigitArray(char *cArray,int *DigitArray,unsigned int iNum); 22. 23.//大数运算: 加法 24.int Add(int *a,int *b,int *&result) 25.{ 26. if(a==NULL || b==NULL || result==NULL) 27. { 28. printf(”multiply: input error\n”); 29. return -1; 30. } 31. int i=0,j=0; 32. //初始化result数组 33. for(i=0;i〈MAX_DIGIT*2;++i) 34. { 35. result[i]=0; 36. } 37. for(i=0;i 38. { 39. result[i] += (a[i]+b[i]); 40. } 41. AjustEncodeArray(result,MAX_DIGIT*2); 42. return 0; 43.} 44. 45.//大数运算: 减法 46.int Sub(int *a,int *b,int *&result) 47.{ 48. if(a==NULL || b==NULL || result==NULL) 49. { 50. printf("multiply: input error\n"); 51. return —1; 52. } 53. int i=0,j=0; 54. //初始化result数组 55. for(i=0;i 56. { 57. result[i]=0; 58. } 59. for(i=0;i 60. { 61. result[i] += (a[i]—b[i]); //result里可以为负数 62. } 63. AjustEncodeArray(result,MAX_DIGIT*2); 64. return 0; 65.} 66. 67.//大数乘法 68.int Multiply(int *a,int *b,int *&result) 69.{ 70. if(a==NULL || b==NULL || result==NULL) 71. { 72. printf("multiply: input error\n”); 73. return —1; 74. } 75. int i=0,j=0; 76. //初始化result数组 77. for(i=0;i〈MAX_DIGIT*2;++i) 78. { 79. result[i]=0; 80. } 81. //a[0]为个位起算,结果的偏移位为i+j, 82. //如个位*十位,则运算结果的偏移为0+1即1 83. //例子: a[0]为9,b[1]为7,则result[1]加63 84. for(i=0;i〈MAX_DIGIT;++i) 85. { 86. for(j=0;j 87. { 88. result[i+j] += a[i]*b[j]; 89. } 90. } 91. AjustEncodeArray(result,MAX_DIGIT*2); 92. return 0; 93.} 94. 95. 96.//逐位调整大数,如result为11 9 22 —3 -2调整为: 1 0 3 9 -3,然后再对符号提升到最高位: 9 9 6 0 2。 .。 。 。 。 —1 97.//表示大数的值为—20699 98.void AjustEncodeArray(int *&result,unsigned int iMaxNum) 99.{ 100. int i = 0; 101. unsigned int iNumFlag = 0; 102. unsigned int iWeight = 0; //有效最高位的权值 103. //遍历找出有效数据的最高位的下标(正负都有可能) 104. for(i=iMaxNum—1;i〉=0;-—i) 105. { 106. if(result[i]! =0) 107. { 108. iNumFlag=i; 109. break; 110. } 111. } 112. //从低位开始往上调整,规则: 大于10的正数要进位,负数要借位 113. for(i=0;i〈iNumFlag;++i) 114. { 115. //进位 116. if(result[i]>0) 117. { 118. result[i+1] += result[i]/10; //十位以上都要进位 119. result[i] = result[i]%10; //调整进位后的当前位 120. } 121. else if(result[i]〈0) 122. { 123. result[i+1] —= 1; //忽略高位是否可借位,强行借位 124. result[i] = 10+result[i]; 125. } 126. } 127. //若有效最高位为负数,需要对负号进行提升,就是对高位与余下低位进行一次减法 128. if(result[iNumFlag]〈0) 129. { 130. iWeight = —result[iNumFlag]; 131. int iMinuend[2*MAX_DIGIT]={0}; 132. iMinuend[iNumFlag] = iWeight; //被减数 133. result[iNumFlag] = 0; //构造减数 134. for(i=0;i〈iNumFlag+1;++i) 135. { 136. result[i] = (iMinuend[i]-result[i]); 137. } 138. //调整借位 139. for(i=0;i 140. { 141. if(result[i]〈0) 142. { 143. result[i+1] —= 1; 144. result[i] = 10+result[i]; 145. } 146. } 147. result[iMaxNum-1] = —1; 148. } 149.} 150. 151.void PrintBigNum(int *result) 152.{ 153. int index = MAX_DIGIT*2-1; 154. bool bNegative = false; 155. //从最高位找到第一个不为负的位,从此位开始为有效值 156. while(result[index]〈=0) 157. { 158. if(result[index]〈0) 159. { 160. bNegative = true; 161. } 162. index——; 163. } 164. if(bNegative) 165. { 166. printf("-”); 167. } 168. for(int i=index;i>=0;——i) 169. { 170. printf("%d”,result[i]); 171. } 172. printf("\n"); 173.} 174. 175.void CArray2revDigitArray(char *cArray,int *DigitArray,unsigned int iNum) 176.{ 177. int i = 0; 178. unsigned int iLen = strlen(cArray); 179. //初始化DigitArray 180. for(i=0; i〈iNum; ++i) 181. { 182. DigitArray[i] = 0; 183. } 184. for(i=0; i〈iLen; ++i) 185. { 186. DigitArray[iLen-1-i] = cArray[i]—’0’; 187. } 188.} 189. 190.int main() 191.{ 192. int a[MAX_DIGIT],b[MAX_DIGIT],resultArray[2*MAX_DIGIT]; 193. char cArray1[MAX_DIGIT],cArray2[MAX_DIGIT]; 194. int ret = 0; 195. int *result = (int *)resultArray; 196. printf(”Input multiplier: \n"); 197. scanf("%s",cArray1); 198. printf("Input multiplicand: \n"); 199. scanf("%s",cArray2); 200. CArray2revDigitArray(cArray1,a,MAX_DIGIT); 201. CArray2revDigitArray(cArray2,b,MAX_DIGIT); 202. ret=Multiply(a,b,result); 203. if(ret! =0) 204. { 205. printf("Multiply error,ret: %d\n”,ret); 206. return -1; 207. } 208. PrintBigNum(result); 209. 210. ret=Add(a,b,result); 211. if(ret! =0) 212. { 213. printf(”Multiply error,ret: %d\n",ret); 214. return -1; 215. } 216. PrintBigNum(result); 217. 218. ret=Sub(a,b,result); 219. if(ret! =0) 220. { 221. printf("Multiply error,ret: %d\n”,ret); 222. return —1; 223. } 224. PrintBigNum(result); 225. return 0; 226.}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 整理 整数 加减乘除
![提示](https://static.bdocx.com/images/bang_tan.gif)