Showing largest divisible number instead of all numbers

Viewed 219

I've started to learn basics of Java and currently I have to find and print largest divisible number.

For example number 30 can be divided by 2, 3, 6 and 10 so on the console I should show only 10. Another example is number 12 which can be divided by 2, 3 and 6 - should show 6.

I'm stuck at the point where I show the largest number. What I have so far is this one

    double isItDivisible = Double.parseDouble(scanner.nextLine());
   
    int num = 2;
    if ( isItDivisible % 2 == 0 ) {
        System.out.println("The number is divisible by " + num);
    } else if ( isItDivisible % 3 == 0 ) {
        num = 3;
        System.out.println("The number is divisible by " + num);
    } else if ( isItDivisible % 6 == 0 ) {
        num = 6;
        System.out.println("The number is divisible by " + num);
    } else if ( isItDivisible % 10 == 0 ) {
        num = 10;
        System.out.println("The number is divisible by " + num);
    } else if ( isItDivisible % 7 == 0 ) {
        System.out.println("The number is divisible by " + 7); 
    }

The snipped display the first occurrence instead of the largest. You can tell how new I'm based on the snipped so please bear with me.

2 Answers

When you want to find the highest divisible number that is not the input you could do the following:

int highest = 1; //1 should always apply - at least for integers

//iterate from highest to lowest number
for( int d = input-1; d > 1; d-- ) {
  //stop at the first number that divides the input without a rest
  if( input % d == 0 ) {
    highest = d;
    break;
  }
}

If you want to check specific numbers only, you could modify that to use a sorted collection of numbers.

//TreeSet is sorted and the reserved comparator makes it sort from high to low
SortedSet<Integer> divisors = new TreeSet<>(Comparator.reversed());

//if the collection itself is sorted the order of additions doesn't matter
//if you're using a list and don't sort it after adding elements then order of insertion is relevant though
divisors.add(2);
divisors.add(10);
divisors.add(3);
divisors.add(7);
divisors.add(6);

Integer highest = null;

//iterates in sorted order
for( Integer d : divisors ) {
  if( input % d == 0 ) {
    highest = d;
    break;
  }
}

Try this :

    public static void  main(String[] args)
    { 
        // Scanner Class 
        Scanner scanner = new Scanner(System.in); 

        double isItDivisible = Double.parseDouble(scanner.nextLine());
        
        int high = 0;
        
        for (int i = 0; i < isItDivisible; i++) {
            if (isItDivisible % i == 0) {
                high = i;
            }
        }
        
        System.out.println(high);
    }

Edit : With divide by pecific numbers 2,3,6,7,10:

public static void  main(String[] args)
    { 
        // Scanner Class 
        Scanner scanner = new Scanner(System.in); 

        double isItDivisible = Double.parseDouble(scanner.nextLine());
        
        int high = 0;       
        
        int[] divide = {2,3,6,7,10};
        Arrays.sort(divide);
        
        for (int i : divide) {
            if (isItDivisible % i == 0) {
                high = i;
            }
        }
        
        System.out.println(high);
    }
Related