Problem: Write a program in Java to output the next largest number using the same digits if possible or else output the same.

Example:

```Input:  123
Output: 132

Input:  1465
Output: 1546```

The trick is to look (from right) for the digit (say `a[i]`) that is greater than the digit at its left (say `a[i-1]`).

If found then look for the digit (say `min`) at the right of index ‘i’ which is smaller than `a[i]` but greater than a[i-i].

Swap `a[i-1]` and `min`.

Sort all the digits after `min` in the ascending order.

The final outcome will be the nearest greatest integer using the same digits.

``````import java.util.*;

public class Main {
public static void main(String[] args){
Scanner in=new Scanner(System.in);

//Input a number and transform it to a char array
System.out.print("Enter a number: ");
char a[]=in.next().toCharArray();

//store the length of number in 'n'
int i, n=a.length;

//check from back for a[i-1] < a[i]
for(i=n-1; i>0; i--){
if(a[i-1] < a[i])
break;
}

//If 'i' value reaches 0, it means digits are in descending order
//Hence, we cannot form any higher number using the same digits
if(i==0){
for(i=0; i<n; i++)
System.out.print(a[i]);
}
else{
//If found then look for (a[i-1] < min < a[i]) after a[i]
int min=i;
for(int j=i+1; j<n; j++){
//if found then copy its index to min
if (a[j]>a[i-1] && a[j]<a[min]){
min = j;
}
}

//swap a[i-1] and a[min]
char temp = a[i-1];
a[i-1] = a[min];
a[min] = temp;

//sort all after min (i.e. after i inclusive) in ascending order
Arrays.sort(a, i, n);

//output the result
System.out.print("Next greater number: ");
System.out.print(a);
}
}
}``````

Output:

Enter a number: 1465
Next greater number: 1546

As you can see, we were successfully able to find the next largest number using the same digits in Java.