#Java - <s>184</s> 175 This is inspired by @Geobits (and a little of @Tal's answer) answer, but enough of it is different that I decided to create my own answer. class G{public static void main(String[]a){for(Integer i=1,q,n=i.valueOf(a[0]),m=i.valueOf(a[1]);m>=++i;System.out.print(q>0?i+"^"+q+" ":""))for(q=0;n%i+m%i<1;n/=i,m/=i)q++;}} Ungolfed (sort of) with (human verification) test harness: class G { public static void mainMethod(String[] a) { for (Integer i = 1, q, n = i.valueOf(a[0]), m = i.valueOf(a[1]); m >= ++i; System.out.print(q > 0 ? i + "^" + q + " " : "")) for (q = 0; n % i + m % i < 1; n /= i, m /= i) q++; } public static void main(String[] a) { m(3, 3); m(196, 294); m(294, 196); m(14, 15); m(15, 14); m(96, 162); m(162, 96); m(300, 400); m(400, 300); m(100, 100); m(7, 7); m(4, 8); } public static void m(int one, int two) { mainMethod(new String[] { String.valueOf(one), String.valueOf(two) }); System.out.println(); } }