このTopCoderの問題はこちらで見ることができる(要TopCoder登録 & 問題文は英語)。問題文についておおまかに説明する。
nという正の整数がproper factorであるというのは、nがaの倍数で、かつaが1でもnでもないということを指す。ある数nのproper factorのすべての要素が含まれている、factors[]という2以上の整数が含まれるリストが与えられる。このとき、nを求めて返すメソッドを作成せよ。
私の解答はこちら。
public class InverseFactoring { public int getTheNumber(int[] factors) { long proper = 1; long max = -1; long min = Long.MAX_VALUE; for( int i=0 ; i<factors.length ; i++ ){ proper = lcm(proper, factors[i]); // 全部の数の最小公倍数を計算 max = Math.max(max, factors[i]); min = Math.min(min, factors[i]); } // factorの全要素の最小公倍数が最大値そのものになったら、 // 最大値はproper factorではないので、最小値だけ掛けてproper factorを求める。 return proper == max ? (int)proper * (int)min : (int)proper; } static long gcd(long a, long b){ // 最大公約数 return b == 0 ? a : gcd(b, a % b); } static long lcm(long a, long b){ // 最小公倍数 return a * b / gcd(a, b); } }
得点は200.54/250、2回目のsubmitでシステムテストクリア。仮定としてfactorsは妥当なものしか入らないので、上のような実装は不要で、factorsの最小値*最大値で導出ができるとのこと。
0 件のコメント:
コメントを投稿