Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

List of divisors of a number

it's my first post so DO stomp me if I wrote something stupid.

I've just started IT classes, and today on "while" loops class my tutor gave us the following homework:

Write a program which reads a natural number n and displays in one graphical box all its divisors from the interval [2; n-1].

So far I came up with a code that works but the result is a bit wrong:

import java.util.Arrays;
import javax.swing.JOptionPane;

public class Divisors {
    public static void main(String[] args) {
        String n = JOptionPane.showInputDialog(null, "Enter a natural number");
        Integer i = Integer.parseInt(n);

        int d = i - 1;
        int x = 2;
        int[] dvr = new int[i]; // [i] because bigger numbers need more iterations

        while (x >= 2 && x <= d) {
            double y = i % x;

            if (y == 0) {
                dvr[x] = x;
                x = x + 1;
            } else {
                x = x + 1;
            }
        }

        JOptionPane.showMessageDialog(null, "The divisors of " + i + " are:\n" + Arrays.toString(dvr));
    }
}

The problem is that the loop fills the array with a lot of zeroes, and the screenshot of tutor's results shows a window listing only the divisors.

I tried to do this with ArrayList, but that's black magic for me right now and my tutor didn't teach us yet how to use anything beyond stuff used in my code anyway.

Any help highly appreciated.

like image 582
Shamanix Avatar asked Oct 12 '15 18:10

Shamanix


People also ask

How do you list all the divisors of a number?

For any natural number N, the divisors (also known as factors) are those numbers that divide the number N without leaving a remainder. For example, Divisors of 15 are 1, 3, 5, 15. All divisors of 24 are 1, 2, 3, 4, 6, 8, 12, 24.

What are the total number of divisors of 78 including 1 and 78?

Answer. Answer: The factors of 78 are: 1, 2, 3, 6, 13, 26, 39 and 78. Required sum = 1 + 2 + 3 + 6 + 13 + 26 + 39 + 78 = 168.


3 Answers

The main problem you're having is that you're going to have an unknown number of values you want to print, but you're using an array to store them, and arrays have a fixed size. Since you have an array of int, it's going to be entirely populated with the default value of zero.

Ideally, you'd only print the first bunch of non-zero values of your array, but you're storing the divisors scattered throughout your array.

dvr[x] = x; stores each value at an index of that value, when really you should just store each new value into the next open spot in the array.

Create a separate index variable, and store each value using it instead:

    int index = 0;
    while (x >= 2 && x <= d) {
    ...
        if (y == 0) {
            dvr[index++] = x;
    ...

Then when your main loop is done, you can create a new "display array" that holds only the divisors, and not the zeros. At this point, index tells you exactly how large it needs to be:

    int[] display = Arrays.copyOf(dvr, index);
    JOptionPane.showMessageDialog(null, "The divisors of " + i + " are:\n" + Arrays.toString(display));
like image 138
azurefrog Avatar answered Oct 19 '22 10:10

azurefrog


In Java the default value of an int is zero. So that is why you see a lot of zeros.

Since you define the size of the array to be i which is more than what is required as the no of divisors would always be less than i.

So instead of printing the entire array you should only print it up to the total no of divisors for which you should a separate variable instead of using x.

Here is the modified version where I am using a separate index variable to keep track of number of divisors which start from 0. In the end you can just print the array up to the index

import java.util.Arrays;
import javax.swing.JOptionPane;

public class Divisors {
public static void main(String[] args) {
    String n = JOptionPane.showInputDialog(null, "Enter a natural number");
    Integer i = Integer.parseInt(n);

    int d = i - 1;
    int index = 0;
    int x=2;
    int[] dvr = new int[i]; // [i] because bigger numbers need more iterations

    while (x >= 2 && x <= d) {
        double y = i % x;

        if (y == 0) {
            dvr[index] = x;
            x = x + 1;
            index= index + 1;
        } else {
            x = x + 1;
        }
    }

    JOptionPane.showMessageDialog(null, "The divisors of " + i + " are:\n" + Arrays.copyOfRange(drv, 0, index));
}
}
like image 30
pgiitu Avatar answered Oct 19 '22 09:10

pgiitu


Set datastructure avoids duplicates, you can use that to overcome the problem of duplicate divisors getting added into the data structure.

    import java.util.*;
    import javax.swing.JOptionPane;

    public class Divisors {
        public static void main(String[] args) {
            String n = JOptionPane.showInputDialog(null, "Enter a natural number");
            Integer i = Integer.parseInt(n);

            int d = i - 1;
            int x = 2;
            Set<Integer> divisors = new HashSet<>();

            while (x >= 2 && x <= d) {
                double y = i % x;

                if (y == 0) {
                     divisors.add(x);
                     x = x + 1;
                } else {
                     x = x + 1;
                }
            }

            List<Integer> l = new ArrayList<>(divisors);
            JOptionPane.showMessageDialog(null, "The divisors of " + i + " are:\n" + l);
        }
    }
like image 1
deepak marathe Avatar answered Oct 19 '22 11:10

deepak marathe