Advertisement
Guest User

Untitled

a guest
Nov 1st, 2014
148
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.38 KB | None | 0 0
  1. // Compute the square root of a huge integer.
  2. #include <iostream>
  3. #include <iomanip>
  4. using std::cin;
  5. using std::cout;
  6. using std::endl;
  7.  
  8. #include <ctime>
  9. #include <cstring>
  10.  
  11. void generateNumber( int number[], int size );
  12. void findSqrt( int number[], int sqrt[], int numberSize, int &sqrtSize );
  13. void multiply( int multiplicand[], int multiplier[], int product[],
  14. int multiplicandSize, int multiplierSize, int &productSize );
  15. bool less( int number1[], int number2[], int number1Size, int number2Size );
  16. void printResult( int number[], int sqrt[], int numberSize, int sqrtSize );
  17. void verify( int number[], int sqrt[], int numberSize, int sqrtSize );
  18. void increment( int number[], int &numberSize );
  19. const int arraySize = 100;
  20.  
  21. // function main begins program execution
  22. int main()
  23. {
  24. srand( static_cast< int >( time(0) ) );
  25. int numberSize = 70 + rand() % 10; // the number of digits of number is numberSize + 1
  26. int number[ arraySize ] = { 0 }; // a huge positive integer in the way that
  27.  
  28. generateNumber( number, numberSize );
  29.  
  30. int sqrt[ arraySize ] = { 0 }; // the square root of number
  31. int sqrtSize = numberSize / 2; // the number of digits of sqrt is sqrtSize + 1
  32.  
  33. findSqrt( number, sqrt, numberSize, sqrtSize );
  34.  
  35. printResult( number, sqrt, numberSize, sqrtSize );
  36.  
  37. verify( number, sqrt, numberSize, sqrtSize );
  38.  
  39. system( "pause" );
  40. } // end function main
  41.  
  42. // put a randomly generated positive integer into the array number,
  43. // the number of digits is size + 1
  44. void generateNumber( int number[], int size )
  45. {
  46. for( int i = 0; i < size; i++ )
  47. number[ i ] = rand() % 10;
  48. number[ size ] = 1 + rand() % 9;
  49. }
  50.  
  51. // if number1 < number2, retuen true; otherwise, return false
  52. bool less( int number1[], int number2[], int number1Size, int number2Size )
  53. {
  54. if( number1Size < number2Size )
  55. return true;
  56. if( number1Size > number2Size )
  57. return false;
  58.  
  59. for( int i = number1Size-1; i >= 0; i-- )
  60. {
  61. if( number1[i] < number2[i] )
  62. return true;
  63. if( number1[i] > number2[i] )
  64. return false;
  65. }
  66.  
  67. return false;
  68. }
  69.  
  70. // put the square root of number into the array sqrt
  71. void findSqrt( int number[], int sqrt[], int numberSize, int &sqrtSize )
  72. {
  73. int c = 0;
  74. int buffer[ arraySize ] = {0} ;
  75. int bufferSize = arraySize;
  76. sqrtSize += 1;
  77. memset( sqrt, 0, sqrtSize*sizeof(int) );
  78. for( int i = sqrtSize-1; i >= 0; i-- )
  79. {
  80. do
  81. {
  82. memset(buffer,0,bufferSize*sizeof(int));
  83. sqrt[i]++;
  84. multiply( sqrt, sqrt, buffer, sqrtSize,sqrtSize,bufferSize );
  85. }
  86. while( less( buffer, number, bufferSize, numberSize ) );
  87. sqrtSize--;
  88. sqrt[i]--;
  89. }
  90. for( int i = sqrtSize-1; i >= 0 && sqrt[i] == 0; i-- )
  91. c++;
  92. sqrtSize -= c;
  93. }
  94.  
  95. // put the product of multiplicand and multiplier into the array product
  96. void multiply( int multiplicand[], int multiplier[], int product[],int multiplicandSize, int multiplierSize, int &productSize )
  97. {
  98. int carry = 0, c = 0;
  99. memset(product, 0, productSize*sizeof(int));
  100. for( int i = 0; i < multiplicandSize; i++ ) // 先乘
  101. for( int j = 0; j < multiplierSize; j++ )
  102. product[i+j] += multiplicand[i] * multiplier[j];
  103.  
  104. for( int i = 0; i < multiplicandSize + multiplierSize; i++ ) // 進位
  105. {
  106. product[i] += carry;
  107. carry = product[i] / 10;
  108. product[i] %= 10;
  109. }
  110.  
  111. for( int i = productSize-1; i >= 0 && product[i] == 0; i-- ) // 算位數
  112. c++;
  113. productSize -= c;
  114. }
  115.  
  116.  
  117.  
  118. // print number and sqrt
  119. void printResult( int number[], int sqrt[], int numberSize, int sqrtSize )
  120. {
  121. cout << "The square root of\n\n";
  122. for( int i = numberSize-1; i >= 0; i-- )
  123. cout << number[ i ];
  124.  
  125. cout << "\n\nis\n\n";
  126. for( int i = sqrtSize-1; i >= 0; i-- )
  127. cout << sqrt[ i ];
  128. cout << endl << endl;
  129. }
  130.  
  131. // print the square of sqrt and the square of ( sqrt + 1 )
  132. // if number is less than the square of sqrt, then print Error
  133. // if the square of ( sqrt + 1 ) is less than number, then print Error
  134. void verify( int number[], int sqrt[], int numberSize, int sqrtSize )
  135. {
  136. for( int i = numberSize-1; i >= 0; i-- )
  137. cout << "-";
  138. cout << endl << endl;
  139.  
  140. int buffer[ arraySize ] = { 0 };
  141. int bufferSize = numberSize;
  142. multiply( sqrt, sqrt, buffer, sqrtSize, sqrtSize, bufferSize );
  143.  
  144. cout << "The square of\n\n";
  145.  
  146. for( int i = sqrtSize-1; i >= 0; i-- )
  147. cout << sqrt[ i ];
  148.  
  149. cout << "\n\nis\n\n";
  150.  
  151. for( int i = bufferSize-1; i >= 0; i-- )
  152. cout << buffer[ i ];
  153. cout << endl << endl;
  154.  
  155. if( less( number, buffer, numberSize, bufferSize ) )
  156. cout << "Error!\n\n";
  157.  
  158.  
  159. int copy[ arraySize ] = {0};
  160. int copySize = sqrtSize;
  161. for( int i = sqrtSize-1; i >= 0; i-- )
  162. copy[ i ] = sqrt[ i ];
  163.  
  164. increment( copy, copySize );
  165.  
  166. multiply( copy, copy, buffer, copySize, copySize, bufferSize );
  167.  
  168. cout << "\nThe square of\n\n";
  169.  
  170. for( int i = copySize-1; i >= 0; i-- )
  171. cout << copy[ i ];
  172.  
  173. cout << "\n\nis\n\n";
  174.  
  175. for( int i = bufferSize-1; i >= 0; i-- )
  176. cout << buffer[ i ];
  177. cout << endl << endl;
  178.  
  179. if( less( buffer, number, bufferSize, numberSize ) )
  180. cout << "Error!\n\n";
  181. }
  182.  
  183. // increment number by 1
  184. void increment( int number[], int &numberSize )
  185. {
  186. int term = 0;
  187. int i;
  188. while( number[ term ] == 9 )
  189. term++;
  190.  
  191. for( i = 0; i < term; i++ )
  192. number[ i ] = 0;
  193.  
  194. number[ term ]++;
  195.  
  196. if( term > numberSize )
  197. numberSize = term;
  198. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement