Sackling
Sackling

Reputation: 1820

Convert string to a large integer?

I have an assignment (i think a pretty common one) where the goal is to develop a LargeInteger class that can do calculations with.. very large integers.

I am obviously not allowed to use the Java.math.bigeinteger class at all.

Right off the top I am stuck. I need to take 2 Strings from the user (the long digits) and then I will be using these strings to perform the various calculation methods (add, divide, multiply etc.)

Can anyone explain to me the theory behind how this is supposed to work? After I take the string from the user (since it is too large to store in int) am I supposed to break it up maybe into 10 digit blocks of long numbers (I think 10 is the max long maybe 9?)

any help is appreciated.

Upvotes: 0

Views: 456

Answers (3)

Kaz
Kaz

Reputation: 58578

Look at the source code for MPI 1.8.6 by Michael Bromberger (a C library). It uses a simple data structure for bignums and simple algorithms. It's C, not Java, but straightforward.

Its division performs poorly (and results in slow conversion of very large bignums to tex), but you can follow the code.

There is a function mpi_read_radix to read a number in an arbitrary radix (up to base 36, where the letter Z is 35) with an optional leading +/- sign, and produce a bignum.

I recently chose that code for a programming language interpreter because although it is not the fastest performer out there, nor the most complete, it is very hackable. I've been able to rewrite the square root myself to a faster version, fix some coding bugs affecting a port to 64 bit digits, and add some missing operations that I needed. Plus the licensing is BSD compatible.

Upvotes: 0

tskuzzy
tskuzzy

Reputation: 36456

First off, think about what a convenient data structure to store the number would be. Think about how you would store an N digit number into an int[] array.

Now let's take addition for example. How would you go about adding two N digit numbers?

Using our grade-school addition, first we look at the least significant digit (in standard notation, this would be the right-most digit) of both numbers. Then add them up.

So if the right-most digits were 7 and 8, we would obtain 15. Take the right-most digit of this result (5) and that's the least significant digit of the answer. The 1 is carried over to the next calculation. So now we look at the 2nd least significant digit and add those together along with the carry (if there is no carry, it is 0). And repeat until there are no digits left to add.

The basic idea is to translate how you add, multiply, etc by hand into code when the numbers are stored in some data structure.

Upvotes: 3

PearsonArtPhoto
PearsonArtPhoto

Reputation: 39698

I'll give you a few pointers as to what I might do with a similar task, but let you figure out the details.

  1. Look at how addition is done from simple electronic adder circuits. Specifically, they use small blocks of addition combined together. These principals will help. Specifically, you can add the blocks, just remember to carry over from one block to the next.
  2. Your idea of breaking it up into smaller blogs is an excellent one. Just remember to to the correct conversions. I suspect 9 digits is just about right, for the purpose of carry overs, etc.

These tasks will help you with addition and subtraction. Multiplication and Division are a bit trickier, but again, a few tips.

  1. Multiplication is the easier of the tasks, just remember to multiply each block of one number with the other, and carry the zeros.
  2. Integer division could basically be approached like long division, only using whole blocks at a time.

I've never actually build such a class, so hopefully there will be something in here you can use.

Upvotes: 1

Related Questions