Advertisement
Guest User

Untitled

a guest
Nov 1st, 2014
168
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.19 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 - 1; i++ )
  47. number[ i ] = rand() % 10;
  48. number[ size ] = 1 + rand() % 9;
  49. }
  50.  
  51. // put the square root of number into the array sqrt
  52. void findSqrt( int number[], int sqrt[], int numberSize, int sqrtSize )
  53. {
  54. int buffer[ arraySize ] = {0} ;
  55. int bufferSize = 0 ;
  56.  
  57. for( int i = sqrtSize; i >= 0; i-- )
  58. {
  59. do
  60. {
  61. memset(buffer,0,arraySize*sizeof(int));
  62. sqrt[i]++;
  63. multiply( sqrt, sqrt, buffer, sqrtSize,sqrtSize,bufferSize );
  64. }
  65. while( less( buffer, number, bufferSize, numberSize ) );
  66. sqrt[i]--;
  67. }
  68. }
  69.  
  70. // put the product of multiplicand and multiplier into the array product
  71. void multiply( int multiplicand[], int multiplier[], int product[],int multiplicandSize, int multiplierSize, int &productSize )
  72. {
  73. memset(product, 0, arraySize*sizeof(int));
  74. for( int i = 0; i < multiplicandSize; i++ ) // 先乘
  75. for( int j = 0; j < multiplierSize; j++ )
  76. product[i+j] += multiplicand[i] * multiplier[j];
  77.  
  78. for( int i = 0; i < multiplicandSize + multiplierSize; i++ ) // 進位
  79. {
  80. if( product[i] > 9 )
  81. {
  82. product[i+1] += product[i] / 10;
  83. product[i] %= 10;
  84. }
  85. }
  86.  
  87. productSize = multiplicandSize + multiplierSize; // 算size
  88. if( product[productSize-1] == 0 )
  89. productSize -= 1;
  90. }
  91.  
  92. // if number1 < number2, retuen true; otherwise, return false
  93. bool less( int number1[], int number2[], int number1Size, int number2Size )
  94. {
  95. if( number1Size < number2Size )
  96. return true;
  97. if( number1Size > number2Size )
  98. return false;
  99.  
  100. for( int i = number1Size; i >= 0; i-- )
  101. {
  102. if( number1[i] < number2[i] )
  103. return true;
  104. if( number1[i] > number2[i] )
  105. return false;
  106. }
  107.  
  108. return false;
  109. }
  110.  
  111. // print number and sqrt
  112. void printResult( int number[], int sqrt[], int numberSize, int sqrtSize )
  113. {
  114. cout << "The square root of\n\n";
  115. for( int i = numberSize; i >= 0; i-- )
  116. cout << number[ i ];
  117.  
  118. cout << "\n\nis\n\n";
  119. for( int i = sqrtSize; i >= 0; i-- )
  120. cout << sqrt[ i ];
  121. cout << endl << endl;
  122. }
  123.  
  124. // print the square of sqrt and the square of ( sqrt + 1 )
  125. // if number is less than the square of sqrt, then print Error
  126. // if the square of ( sqrt + 1 ) is less than number, then print Error
  127. void verify( int number[], int sqrt[], int numberSize, int sqrtSize )
  128. {
  129. for( int i = numberSize; i >= 0; i-- )
  130. cout << "-";
  131. cout << endl << endl;
  132.  
  133. int buffer[ arraySize ] = { 0 };
  134. int bufferSize = numberSize;
  135. multiply( sqrt, sqrt, buffer, sqrtSize, sqrtSize, bufferSize );
  136.  
  137. cout << "The square of\n\n";
  138.  
  139. for( int i = sqrtSize; i >= 0; i-- )
  140. cout << sqrt[ i ];
  141.  
  142. cout << "\n\nis\n\n";
  143.  
  144. for( int i = bufferSize; i >= 0; i-- )
  145. cout << buffer[ i ];
  146. cout << endl << endl;
  147.  
  148. if( less( number, buffer, numberSize, bufferSize ) )
  149. cout << "Error!\n\n";
  150.  
  151.  
  152. int copy[ arraySize ] = {0};
  153. int copySize = sqrtSize;
  154. for( int i = sqrtSize; i >= 0; i-- )
  155. copy[ i ] = sqrt[ i ];
  156.  
  157. increment( copy, copySize );
  158.  
  159. multiply( copy, copy, buffer, copySize, copySize, bufferSize );
  160.  
  161. cout << "\nThe square of\n\n";
  162.  
  163. for( int i = copySize; i >= 0; i-- )
  164. cout << copy[ i ];
  165.  
  166. cout << "\n\nis\n\n";
  167.  
  168. for( int i = bufferSize; i >= 0; i-- )
  169. cout << buffer[ i ];
  170. cout << endl << endl;
  171.  
  172. if( less( buffer, number, bufferSize, numberSize ) )
  173. cout << "Error!\n\n";
  174. }
  175.  
  176. // increment number by 1
  177. void increment( int number[], int &numberSize )
  178. {
  179. int term = 0;
  180. int i;
  181. while( number[ term ] == 9 )
  182. term++;
  183.  
  184. for( i = 0; i < term; i++ )
  185. number[ i ] = 0;
  186.  
  187. number[ term ]++;
  188.  
  189. if( term > numberSize )
  190. numberSize = term;
  191. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement