クリスマスに競技プログラミングといた/その1
メリークリスマス。クリスマスはギークハウス高円寺と水道橋でしろくまさんのustみながらコードを書いていましたごんげです。
時間が空いてしまいましたが久しぶりに競技プログラミングの問題解きました。
まぁ@mojaieさんがもうだいぶ先まで解いてくれてるから、彼のコードと見比べて見るのもいいですね。
それでは早速いきます。前回の続きでlevel0の5問目からです。
==
0005: GCD and LCM
問題
Write a program which computes the greatest common divisor (GCD) and the least common multiple (LCM) of given a and b (0 < a, b ≤ 2,000,000,000). You can supporse that LCM(a, b) ≤ 2,000,000,000.
GCD and LCM | Aizu Online Judge
回答
import java.util.*; class GCD { public static void main (String args[]) { Scanner scn = new Scanner(System.in); int a = scn.nextInt(); int b = scn.nextInt(); int i = 0; ArrayList<Integer> gcd = new ArrayList<Integer>(); while (i>=0) { if (i==0) { gcd.add(a % b); } else if (i==1) { gcd.add(b % gcd.get(i-1)); } else { gcd.add(gcd.get(i-2) % gcd.get(i-1)); } if (gcd.get(i)==0) { System.out.println("GCD=" + gcd.get(i-1)); int lcm = a * b / gcd.get(i-1); System.out.println("LCM=" + lcm); break; } i++; } } }
感想
最大公約数と最小公倍数を求める問題。アルゴリズムはユーグリッドの互除法です。これですね
ユーグリッドの互除法:ユークリッドの互除法 - Wikipedia
まぁこれ自体は複雑なアルゴリズムなわけではないのですが、なんでこの計算方法で最大公約数が出せるのか・・・誰か説明してくれ。ぶっちゃけよくわからんでした。数学って難しいな。
==
0006: Reverse Sequence
問題
Write a program which reverses a given string str.
回答
import java.io.*; import java.util.*; class ReverseSequence { public static void main (String args[]) throws java.io.IOException { BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); String input= in.readLine(); ArrayList<Character> output = new ArrayList<Character>(); for(int i=input.length()-1;i>=0;i--) { output.add(input.charAt(i)); } System.out.println(output); } }
感想
また配列を逆から回してる。なんかいいやり方ありそうな気がするけど。っていうか今思うとこれ出力おかしいよね・・・。
なんかもう少しあるのでわけて書きます
その2はこちら
http://d.hatena.ne.jp/gong023/20111225/1324825134