OLD | NEW |
(Empty) | |
| 1 // Sample program demonstrating the use of the Big Integer Library. |
| 2 |
| 3 // Standard libraries |
| 4 #include <string> |
| 5 #include <iostream> |
| 6 |
| 7 // `BigIntegerLibrary.hh' includes all of the library headers. |
| 8 #include "BigIntegerLibrary.hh" |
| 9 |
| 10 int main() { |
| 11 /* The library throws `const char *' error messages when things go |
| 12 * wrong. It's a good idea to catch them using a `try' block like this |
| 13 * one. Your C++ compiler might need a command-line option to compile |
| 14 * code that uses exceptions. */ |
| 15 try { |
| 16 BigInteger a; // a is 0 |
| 17 int b = 535; |
| 18 |
| 19 /* Any primitive integer can be converted implicitly to a |
| 20 * BigInteger. */ |
| 21 a = b; |
| 22 |
| 23 /* The reverse conversion requires a method call (implicit |
| 24 * conversions were previously supported but caused trouble). |
| 25 * If a were too big for an int, the library would throw an |
| 26 * exception. */ |
| 27 b = a.toInt(); |
| 28 |
| 29 BigInteger c(a); // Copy a BigInteger. |
| 30 |
| 31 // The int literal is converted to a BigInteger. |
| 32 BigInteger d(-314159265); |
| 33 |
| 34 /* This won't compile (at least on 32-bit machines) because the |
| 35 * number is too big to be a primitive integer literal, and |
| 36 * there's no such thing as a BigInteger literal. */ |
| 37 //BigInteger e(3141592653589793238462643383279); |
| 38 |
| 39 // Instead you can convert the number from a string. |
| 40 std::string s("3141592653589793238462643383279"); |
| 41 BigInteger f = stringToBigInteger(s); |
| 42 |
| 43 // You can convert the other way too. |
| 44 std::string s2 = bigIntegerToString(f); |
| 45 |
| 46 // f is implicitly stringified and sent to std::cout. |
| 47 std::cout << f << std::endl; |
| 48 |
| 49 /* Let's do some math! The library overloads most of the |
| 50 * mathematical operators (including assignment operators) to |
| 51 * work on BigIntegers. There are also ``copy-less'' |
| 52 * operations; see `BigUnsigned.hh' for details. */ |
| 53 |
| 54 // Arithmetic operators |
| 55 BigInteger g(314159), h(265); |
| 56 std::cout << (g + h) << '\n' |
| 57 << (g - h) << '\n' |
| 58 << (g * h) << '\n' |
| 59 << (g / h) << '\n' |
| 60 << (g % h) << std::endl; |
| 61 |
| 62 // Bitwise operators |
| 63 BigUnsigned i(0xFF0000FF), j(0x0000FFFF); |
| 64 // The library's << operator recognizes base flags. |
| 65 std::cout.flags(std::ios::hex | std::ios::showbase); |
| 66 std::cout << (i & j) << '\n' |
| 67 << (i | j) << '\n' |
| 68 << (i ^ j) << '\n' |
| 69 // Shift distances are ordinary unsigned ints. |
| 70 << (j << 21) << '\n' |
| 71 << (j >> 10) << '\n'; |
| 72 std::cout.flags(std::ios::dec); |
| 73 |
| 74 // Let's do some heavy lifting and calculate powers of 314. |
| 75 int maxPower = 10; |
| 76 BigUnsigned x(1), big314(314); |
| 77 for (int power = 0; power <= maxPower; power++) { |
| 78 std::cout << "314^" << power << " = " << x << std::endl; |
| 79 x *= big314; // A BigInteger assignment operator |
| 80 } |
| 81 |
| 82 // Some big-integer algorithms (albeit on small integers). |
| 83 std::cout << gcd(BigUnsigned(60), 72) << '\n' |
| 84 << modinv(BigUnsigned(7), 11) << '\n' |
| 85 << modexp(BigUnsigned(314), 159, 2653) << std::endl; |
| 86 |
| 87 // Add your own code here to experiment with the library. |
| 88 } catch(char const* err) { |
| 89 std::cout << "The library threw an exception:\n" |
| 90 << err << std::endl; |
| 91 } |
| 92 |
| 93 return 0; |
| 94 } |
| 95 |
| 96 /* |
| 97 The original sample program produces this output: |
| 98 |
| 99 3141592653589793238462643383279 |
| 100 314424 |
| 101 313894 |
| 102 83252135 |
| 103 1185 |
| 104 134 |
| 105 0xFF |
| 106 0xFF00FFFF |
| 107 0xFF00FF00 |
| 108 0x1FFFE00000 |
| 109 0x3F |
| 110 314^0 = 1 |
| 111 314^1 = 314 |
| 112 314^2 = 98596 |
| 113 314^3 = 30959144 |
| 114 314^4 = 9721171216 |
| 115 314^5 = 3052447761824 |
| 116 314^6 = 958468597212736 |
| 117 314^7 = 300959139524799104 |
| 118 314^8 = 94501169810786918656 |
| 119 314^9 = 29673367320587092457984 |
| 120 314^10 = 9317437338664347031806976 |
| 121 12 |
| 122 8 |
| 123 1931 |
| 124 |
| 125 */ |
OLD | NEW |