練習問題
1. GrandTotal改
第0講 練習問題 3. 総和を求めるを
再帰呼び出しを使って計算するプログラムを作成してください.
クラス名は,GrandTotal2
としてください.
また,コマンドライン引数で最大値を与えられるようにしてください.
出力例
$ java GrandTotal2
1から10までの総和は55です.
$ java GrandTotal2 10
1から10までの総和は55です.
$ java GrandTotal2 100
1から100までの総和は5050です.
$ java GrandTotal2 90
1から90までの総和は4095です.
2. Fibonacci数列 改
第1講 練習問題 5. Fibonacci数列を
再帰呼び出しを使って計算してみましょう.
Fibonacci数列の$n$項目の値を出力してください.
クラス名はFibonacci2
としてください.
コマンドライン引数に値が指定されない場合は,10項目が指定されたものとしてください. コマンドライン引数に複数個の数値が与えられた場合,全ての数値に対して結果を出力してください.
出力例
$ java Fibonacci2
55
$ java Fibonacci2 1 2
fibonacci(1) = 1
fibonacci(2) = 1
$ java Fibonacci2 4 10 20
fibonacci(4) = 3
fibonacci(10) = 55
fibonacci(20) = 6765
$ java Fibonacci2 40
fibonacci(40) = 102334155
3. 最小公倍数
コマンドライン引数で与えられた全ての数値の最小公倍数(Least Common Multiple)を求めるプログラムを作成してください.
クラス名は Lcm
としてください.
なお,2つの数の最小公倍数は次の式で求められます.
\[ {\rm lcm}(a, b)=|ab|/{\rm gcd}(a, b) \]
出力例
$ java Lcm 3 6
lcm(3, 6) = 6
$ java Lcm 30 42
lcm(30, 42) = 210
$ java Lcm 3 6
lcm(3, 6, 9, 18)=18
$ java Lcm 1 2 3 4 5 6 7
lcm(1, 2, 3, 4, 5, 6, 7)=420
ヒント
処理の流れ
与えられた全ての数($a_1, a_2, …, a_n$)の最小公倍数を求めるには,次のように計算すると良いでしょう. つまり,最初の2つの数($a_1$と$a_2$)の最小公倍数を求め,$l_1$ とする. 次に,$l_1$と$a_3$の最小公倍数を求め,$l_2$とする. 続けて,順番に最小公倍数を求めていくと良いでしょう.
\[ {\rm lcm}({\rm lcm}({\rm lcm}(a_1, a_2), a_3), …) \]
文字列の結合
文字列を特定の文字で区切って結合するには,String.join
メソッドを使うと良いでしょう.
String[] array = // ... "1", "2", "3", "4"
String joined = String.join(", ", array); // "1, 2, 3, 4"という文字列が得られる.
その他
4. 回文チェッカー
コマンドライン引数で与えられた文字列(複数指定可)が回文(palindrome)であるかどうかを確認するプログラムを作成してください. 回文とは,始めから読んだ場合と終わりから読んだ場合とで,文字の出現する順番が同じである文字列のことを指します (本来は意味の通じるように,という条件もありますが,プログラムでは判断するのは難しいので,意味については関知しないものとします).
クラス名は PalindromeChecker
としてください.
出力例
$ java PalindromeChecker akasaka
akasaka: true
$ java PalindromeChecker ABBA madamimadam
ABBA: true
madamimadam: true # Madam, I'm Adam
$ java PalindromeChecker あかさか わにのにわ つつみがみっつ
あかさか: false
わにのにわ: true
つつみがみっつ: false
一般的な回文では,濁音,半濁音,促音,拗音は清音と同一視されます
(つつみがみっつ
は回文として扱われる).
しかし,処理がややこしくなりますので,上記の条件は無視して良いです
(つつみがみっつ
は回文として扱わなくて良いです).
ヒント1: 文字列のn文字目を取得する.
文字列(String
型)のn文字目を取得するには,charAt
メソッドを用います.
charAt
メソッドは1つのInteger
型の値を受け取り,Character
型の変数を返します.
String string = "abracadabra";
Character c1 = string.charAt(0);
// => 'a'(1文字目の'a')
Character c1 = string.charAt(string.length() - 1);
// => 'a'(最後の文字の'a')
ヒント2: 部分文字列を取得する
文字列(String
型)の部分文字列を取得するには,substring
メソッドを用います.
substring
メソッドは1つ,もしくは2つのInteger
型を受け取ります.
String string = "abracadabra";
String sub1 = string.substring(2);
// => "racadabra"
String sub2 = string.substring(2, string.length() - 2);
// => "racadab"
String sub3 = string.substring(1, string.length() - 1);
// => "bracadabr"
ヒント3: 考え方
次の考え方で回文であるかを判定できます.
まず,isPalindrome
メソッドを定義しましょう.
引数は1つのString
型を受け取り,Boolean
型を返します.
- メソッドの最初で,文字列の長さが1文字以下ならば回文であると判定します.
- そうでないなら,受け取った文字列から最初の文字(
first
)と最後の文字(last
)を取得します(文字列のn文字目を取得する). first
とlast
が一致しなければ,回文ではないと判定します.- 最初と最後の文字を除いた部分文字列を取得します(部分文字列を取得する).
- 取得した部分文字列を引数にして,
isPalindrome
を呼び出し,その結果をメソッドの返り値とします.
以下も参照してください.