you will generate a NON THREADED, SEQUENTIAL program.  This sequential program will take some input (you can grab this input from the user, or from a command line argument) that it will store in an integer.  (Therefore, there needs to be checks in place to make sure that the number being given can be stored adequately in an integer.  You do not need to use BigInteger or long for this, regular integersis fine.  This is more about design than about function).

Now that you have this number, you want to compute all the prime numbers that exist between 2 and that number (inclusive).

If a number is not prime, you will store that number and a List of its factors in a Map<Integer, Integer[]>

If a number is prime you will store it in a List.  So, at the conclusion, we have a Map of non primes that contain factors of numbers and a list of primes.

You will time the runtime of your application so that we know how long it will take to build these two structures.  To time your application, simply generate a starting time as soon as you retrieve the number you want to use as the base of your iteration and then stop the timer when you are finished generating your structures.  Report back what the difference is. You can use System.currentTimeMillis(); to do this.