高精度数字四则运算编码笔记

 

  
  
  
  
  1. #include 
  2. //括号必不可少! 
  3. #define max(a,b) (a>b?a:b)  
  4. #define MAX 1000 
  5. #define PLUS 1 
  6. #define MINUS -1 
  7.  
  8. struct bignum{ 
  9. char digit[MAX]; 
  10. int signbit; 
  11. int lastdigit; 
  12. }; 
  13. void add(bignum* a,bignum* b,bignum* c); 
  14. void initialize(bignum* c); 
  15. int print_digit(bignum* d ); 
  16. int scan_digit(bignum* d ); 
  17. void subtract(bignum* a,bignum* b,bignum* c); 
  18. void justify(bignum* n); 
  19. int compare(bignum* a,bignum* b); 
  20. void multiply(bignum* a,bignum* b,bignum* c); 
  21. void add_num(bignum* a,int n,int s); 
  22. void divide(bignum* a,bignum* b,bignum* c ); 
  23.  
  24. int print_digit(bignum* d ){ 
  25. int i=d->lastdigit; 
  26. if(d->signbit==MINUS) printf("-"); 
  27. while(i>=0) 
  28. printf("%c",d->digit[i--]+'0'); 
  29. printf("\n"); 
  30. return 1; 
  31. int scan_digit(bignum* d ){ 
  32. initialize(d); 
  33. int a; 
  34. scanf("%d",&a); 
  35. if(a>=0) 
  36. d->signbit=PLUS; 
  37. else
  38. d->signbit=MINUS; 
  39. a=-a; 
  40. int i=0; 
  41. while(a){ 
  42. d->digit[i++]=a; 
  43. a/=10; 
  44. d->lastdigit=i-1; 
  45. return 1; 
  46. void initialize(bignum* c){ 
  47. c->lastdigit=0; 
  48. forint i=0;i 
  49. c->digit[i]=0; 
  50. c->signbit=PLUS; 
  51. void subtract(bignum* a,bignum* b,bignum* c){ 
  52. initialize(c); 
  53. //这里原来代码不优良,一共有4种情况,其中三种可以转化为加,我们需要做的只是在减法里实现正数相减,其他的不在这里考虑 
  54. //那么是不是可以这样想,我们解决程序设计时,要确定一个最小分类,就像离散数学中的运算,{~,U} 就可以代表全集! 
  55. //想得少,做得多,多的差;想得多,做得少,做精良 
  56. if( a->signbit==MINUS || b->signbit==MINUS ){ 
  57. b->signbit*=-1; 
  58. add(a,b,c); 
  59. b->signbit*=-1; 
  60. return ; 
  61. if(!compare(a,b)){ 
  62. subtract(b,a,c); 
  63. //为什么符号位设为+1,-1呢?就是为了这种地方更清晰简洁! 
  64. c->signbit*=-1; 
  65. return ; 
  66. c->lastdigit=max(a->lastdigit,b->lastdigit)+1; 
  67. forint i=0;i!=c->lastdigit ;i++ ){ 
  68. if(a->digit[i]digit[i] ){ 
  69. a->digit[i+1]--; 
  70. c->digit[i]= a->digit[i]+10-b->digit[i]; 
  71. c->digit[i]=a->digit[i]-b->digit[i]; 
  72. justify(c); 
  73. return ; 
  74. int compare(bignum* a,bignum* b){ 
  75. if(a->signbit!=b->signbit ) 
  76. return a->lastdigit==PLUS; 
  77. if(a->lastdigit!=b->lastdigit ){ 
  78. if(a->signbit==PLUS) 
  79. return a->lastdigit-b->lastdigit>=0; 
  80. return a->lastdigit-b->lastdigit < 0; 
  81. int i=a->lastdigit; 
  82. for( ; a->digit[i]==b->digit[i] ;i-- ); 
  83. if(a->signbit==PLUS) 
  84. return a->digit[i]-b->digit[i]>=0; 
  85. return a->digit[i]-b->digit[i]<0; 
  86. void justify(bignum* n){ 
  87. while( n->digit[n->lastdigit]==0&&n->lastdigit!=0 ) 
  88. n->lastdigit--; 
  89. if(n->lastdigit==0&&n->digit[0]==0) 
  90. n->signbit=PLUS; 
  91. void add(bignum* a,bignum* b,bignum* c){ 
  92. initialize(c); 
  93. if( a->signbit==b->signbit) c->signbit=a->signbit; 
  94. else
  95. if(a->signbit==MINUS){ 
  96. a->signbit=PLUS; 
  97. subtract(b,a,c); 
  98. a->signbit=MINUS; 
  99. else
  100. b->signbit=PLUS; 
  101. subtract(a,b,c); 
  102. b->signbit=MINUS; 
  103. return
  104. int carry=0; 
  105. c->lastdigit=max( a->lastdigit,b->lastdigit)+1 ; 
  106. forint i=0;i!=c->lastdigit ;i++ ){ 
  107. c->digit[i] =(a->digit[i]+b->digit[i]+carry) ; 
  108. carry=(a->digit[i]+b->digit[i]+carry)/10;  
  109. justify(c); 
  110. return ; 
  111. void add_num(bignum* a,int n,int s){ 
  112. n%=10;//保证输入的数不是比10大的 
  113. forint i=a->lastdigit;i!=-1 ;i-- ) 
  114. a->digit[s+i]=a->digit[i]; 
  115. for(int i=0;i!=s;i++) 
  116. a->digit[i]=n; 
  117. a->lastdigit+=s; 
  118. void multiply(bignum* a,bignum* b,bignum* c){ 
  119. initialize(c); 
  120. if( !compare(a,b) ){ 
  121. multiply(b,a,c); 
  122. return ; 
  123. if(b->lastdigit==0){ 
  124. int carry=0; 
  125. c->lastdigit=max(a->lastdigit,b->lastdigit )+1; 
  126. int i=0; 
  127. for( ;i<=a->lastdigit ;i++ ){ 
  128. c->digit[i] =(a->digit[i]*b->digit[0]+carry) ; 
  129. carry=(a->digit[i]*b->digit[0]+carry)/10;  
  130. c->digit[i]=carry; 
  131. justify(c); 
  132. c->signbit=a->signbit*b->signbit; 
  133. return ; 
  134. bignum n,m; 
  135. initialize( &m ); 
  136. forint i=0;i<=a->lastdigit ;i++ ){ 
  137. m.digit[0]=b->digit[i]; 
  138. multiply(a,&m,&n ); 
  139. add_num(&n,0,i); 
  140. bignum g; 
  141. add(c,&n,&g); 
  142. *c=g; 
  143. c->signbit=a->signbit*b->signbit; 
  144. void divide(bignum* a,bignum* b,bignum* c ){ 
  145. //叠减 
  146.  
  147. int main(){ 
  148. struct bignum a; 
  149. struct bignum b; 
  150. struct bignum c; 
  151. scan_digit(&a); 
  152. scan_digit(&b); 
  153. // add(&a,&b,&c); 
  154. // print_digit(&c); 
  155. // printf("%d",compare( &a,&b ) ); 
  156. divide(&a,&b,&c); 
  157. print_digit(&c); 
  158. return 0; 

先写这么多~代码中包含一些自己的个人看法,以后用来可以回顾

你可能感兴趣的:(高精度数字四则运算)