Вам нужен GCD. Либо используйте BigInteger, как упомянул Натан, либо, если не можете, используйте свой собственный.
public int GCD(int a, int b){
if (b==0) return a;
return GCD(b,a%b);
}
Затем вы можете разделить каждое число на GCD, как вы делали выше.
Это даст вам неправильную дробь. Если вам нужна смешанная дробь, вы можете получить новые числа. Например, если у вас было 1500 и 500 для входных данных, вы бы получили 3/2 в качестве ответа. Может быть, вы хотите 1 1/2. Таким образом, вы просто делите 3/2 и получаете 1, а затем получаете остаток от 3/2, который также равен 1. Знаменатель останется прежним.
whole = x/y;
numerator x%y;
denominator = y;
Если вы не верите мне, что это работает, вы можете проверить
http://en.wikipedia.org/wiki/Euclidean_algorithm
Мне просто нравится рекурсивная функция, потому что она проста и понятна.
Ваш алгоритм близок, но не совсем корректен. Кроме того, вам, вероятно, следует создать новую функцию, если вы хотите найти gcd. Просто делает его немного чище и легче для чтения. Вы также можете проверить эту функцию.