diff --git a/docs/text/chapter-1/practice/hello-shell.md b/docs/text/chapter-1/practice/hello-shell.md index cd7848c7..63bc070c 100644 --- a/docs/text/chapter-1/practice/hello-shell.md +++ b/docs/text/chapter-1/practice/hello-shell.md @@ -71,7 +71,11 @@ cat index.txt ::: -::: spoiler hint 1 +### ヒント + +::: info ヒント1 + +::: spoiler クリックして展開 ファイルの検索は `find` コマンドを使います。 `man find` で find コマンドについて調べることができます。ただし英語。 @@ -81,20 +85,28 @@ cat index.txt ::: -::: spoiler hint 2 +::: info ヒント2 + +::: spoiler クリックして展開 `find . -name [探したいファイル]` で調べられます。 `*` を使うと、曖昧検索ができます。 `code-*` と書くと、 `code-` で始まるファイルを検索できます。 ::: -::: spoiler hint 3 +::: info ヒント3 + +::: spoiler クリックして展開 - `find . -name '*.txt'` でファイルを見つけることができます。 - `cat [FILE]` でファイルを開くことができます。 `TAB` キーを押すと、候補を選んでくれます。 ::: -::: spoiler answer +### 解答 + +::: tip 解答 + +::: spoiler クリックして展開 `cat 6db1b5a2e7/08dc869896/memo.txt` でファイルを開いてみましょう。 diff --git a/docs/text/chapter-2/practice/4bit.md b/docs/text/chapter-2/practice/4bit.md index 45a54a8b..98639f33 100644 --- a/docs/text/chapter-2/practice/4bit.md +++ b/docs/text/chapter-2/practice/4bit.md @@ -2,25 +2,65 @@ 入力から$0 <= n < 16$の整数値を受け取り、2進数で表記しよう。 -:::spoiler Hint 1 -int型では、`5 / 3`は`1`になる。 +### 入力/出力例 + +::: details 例1 + +**入力** + +``` +9 +``` + +**出力** + +``` +1001 +``` ::: -:::spoiler Hint 2 +::: details 例2 + +**入力** + +``` +13 +``` + +**出力** + +``` +1101 +``` + +::: + +### ヒント + +::: details ヒント1 +`int`型では、`5 / 3`は`1`になる。 + +::: + +::: details ヒント2 整数型の余りは`%`で得ることができる。 ::: -:::spoiler Hint 3 +::: details ヒント3 1桁ずつ出力してみよう。 ::: -:::spoiler Hint 4 +::: details ヒント4 $\displaystyle\left\lfloor\frac{n}{2^k}\right\rfloor$を2進数表記すると、$n$の2進数表記の$k+1$桁目以上を得ることができる。 ::: -:::spoiler Answer +### 解答例 + +::: tip 解答例1 + +::: spoiler クリックして展開 ```cpp #include using namespace std; diff --git a/docs/text/chapter-2/practice/multiplication.md b/docs/text/chapter-2/practice/multiplication.md index 3e65e6eb..dc3d3f64 100644 --- a/docs/text/chapter-2/practice/multiplication.md +++ b/docs/text/chapter-2/practice/multiplication.md @@ -2,15 +2,39 @@ cinでint型の整数を2つ受け取って、その積をターミナルに出力しよう。 -:::spoiler Hint 1 +### 入力/出力例 + +::: details 例1 + +**入力** + +``` +3 4 +``` + +**出力** + +``` +12 +``` + +::: + +### ヒント + +::: details ヒント1 + 2つの値を入力から受け取るには、 ```cpp cin >> first_value >> second_value; ``` - ::: -:::spoiler Answer +### 解答例 + +::: tip 解答例1 + +::: spoiler クリックして展開 ```cpp #include diff --git a/docs/text/chapter-2/practice/sum.md b/docs/text/chapter-2/practice/sum.md index c0a6fc5b..0b82538e 100644 --- a/docs/text/chapter-2/practice/sum.md +++ b/docs/text/chapter-2/practice/sum.md @@ -2,25 +2,68 @@ cin で自然数 $n$ を受け取って、$1$ から $n$ までの和を出力するプログラムを作成してください。 -例えば `10` を受け取ったとき、 1+2+3+4+5+6+7+8+9+10 を計算して `55` を出力できれば OK です。 +### 入力/出力例 + +::: details 例1 + +**入力** + +``` +10 +``` + +**出力** + +``` +55 +``` + +> $1+2+3+4+5+6+7+8+9+10$ を計算します。 -::: spoiler Hint 1 -今までの知識で解けるはず。手で計算する時、わざわざ足していますか? ::: -::: spoiler Hint 2 +::: details 例2 + +**入力** + +``` +100 +``` + +**出力** + +``` +5050 +``` + +> $1+2+ \dots + 100$ を計算します。 + +::: + +### ヒント + +::: details ヒント1 + +実際に計算する際にどのような手順で行うかを考えてみましょう。100までの総和などは1つずつ足していくのではなく、なんらかの方法でもっと簡単に求めていたはずです。 +::: + +::: details ヒント2 + 総和を求める公式は $\dfrac{1}{2} n (n+1)$ でした。 ::: -::: spoiler Hint 3 (なぜか計算が合わない人) -プログラムにおいては、計算は左から順番に行われ、途中計算は必ず int 型(=整数)に切り捨てられます。 +::: details ヒント3 (なぜか計算が合わない人へ) -つまり、最初に `1/2` と書くとそこで 0 になってしまいます。 +プログラムにおいては、計算は左から順番に行われ、途中計算は必ず `int` 型(=整数)に切り捨てられます。つまり、最初に `1/2` と書くとそこで 0 になってしまいます。 計算の順序を工夫する必要がありそうです。 ::: -::: spoiler Answer +### 解答例 + +::: tip 解答例1 + +::: spoiler クリックして展開 ```cpp #include diff --git a/docs/text/chapter-3/practice/de-morgans-laws.md b/docs/text/chapter-3/practice/de-morgans-laws.md index 5ed46f10..d0497f90 100644 --- a/docs/text/chapter-3/practice/de-morgans-laws.md +++ b/docs/text/chapter-3/practice/de-morgans-laws.md @@ -1,6 +1,6 @@ # 3-B2. De Morgan's laws -`bool`型の値`P`、`Q`が与えられるので、ド・モルガンの法則が成り立つことを実際に確かめよう。 +`bool`型の値`P`、`Q`から、論理演算子(`!`, `&&`, `||`)を用いてド・モルガンの法則が成り立つことを実際に確かめよう。 ::: tip ド・モルガンの法則 @@ -10,31 +10,68 @@ $\lnot(P \lor Q) \Leftrightarrow \lnot P \land \lnot Q$ ::: +### 入力/出力例 -:::spoiler Hint -考えられる$P,Q$の組は以下の4つ +以下の例では上のド・モルガンの法則の式の1つ目を`case 1`、2つ目を`case 2`としてコード内でチェックを行い、左辺と右辺の結果が一致している場合は`ok`と出力します。 -| (P,Q) | P = false | P = true | -| --- | --- | --- | -| Q = false | (false, false) | (true, false) | -| Q = true | (false, true) | (true, true) | +::: details 例1 +**入力** + +``` +true false +``` + +**出力** + +``` +case 1: ok +case 2: ok +``` + +::: + +### ヒント + +::: details ヒント1 +PとQが文字列として与えられるため、まずは`string`型で入力を受け取り、その値をチェックして`bool`型に変換しましょう。`==`演算子を用いればできるはず。 ::: -:::spoiler Answer +::: details ヒント2 +受け取った文字列を比較し、`"true"`と比較した結果を`bool`型の変数に代入しましょう。 + +```cpp +bool p = p_string == "true"; +``` + +`==`などの演算子も結果が`bool`型になるだけで、本質的には`+`などの演算と変わりありません。そのため、`if`文の条件などに使用するだけでなく、このようにして変数に結果を格納することも可能です。 +::: + +### 解答例 + +::: tip 解答例1 + +::: spoiler クリックして展開 ```cpp #include using namespace std; int main() { + // 入力をstringとして受け取る string p_string, q_string; cin >> p_string >> q_string; + + // 文字列が"true"かどうかをチェックし、bool型としてPとQを格納 bool p = p_string == "true"; bool q = q_string == "true"; + + // case 1 if (!(p && q) == (!p || !q)) { cout << "case 1: ok" << endl; } + + // case 2 if (!(p || q) == (!p && !q)) { cout << "case 2: ok" << endl; } diff --git a/docs/text/chapter-3/practice/echo.md b/docs/text/chapter-3/practice/echo.md index b23778ff..44e87cef 100644 --- a/docs/text/chapter-3/practice/echo.md +++ b/docs/text/chapter-3/practice/echo.md @@ -2,14 +2,36 @@ 入力から単語を1つ受け取り、それを出力しよう。 -:::spoiler Hint 1 +### 入力/出力例 + +::: details 例1 + +**入力** + +``` +Hello! +``` + +**出力** + +``` +Hello! +``` + +::: + +### ヒント + +::: details ヒント1 + 文字列型の変数を使うには、 ```cpp string s; ``` ::: -:::spoiler Hint 2 +::: details ヒント2 + もしもこんなエラーが出たとしたら、 ``` ./Main.cpp:4:5: error: unknown type name 'string'; did you mean 'std::string'? @@ -24,12 +46,16 @@ using namespace std; で、`std::`を省略できるようにしよう。 ::: -:::spoiler Hint 3 +::: details ヒント3 + 入力を受け取るには`cin`を、出力するには`cout`を使おう。 ::: +### 解答例 + +::: tip 解答例1 -:::spoiler Answer +::: spoiler クリックして展開 ```cpp #include diff --git a/docs/text/chapter-3/practice/fraction.md b/docs/text/chapter-3/practice/fraction.md index d97383b3..45357ed6 100644 --- a/docs/text/chapter-3/practice/fraction.md +++ b/docs/text/chapter-3/practice/fraction.md @@ -1,36 +1,75 @@ # 3-A2. Fraction -入力から整数$a,b,c,d$を受け取り、$a/b+c/d$を計算して、存在するなら分数`n/d`として表示しよう。 -### 入出力例 1 -入力 +入力から整数$a,b,c,d$を受け取り、$a/b+c/d$を計算して、存在するなら分数`n/d`のような文字列して表示しよう。 + +結果を約分する必要はないものとします。 + +### 入力/出力例 + +::: details 例1 + +**入力** + ``` 1 2 3 4 ``` -出力例 + +**出力** + ``` 10/8 ``` -約分する必要はない。 -### 入出力例 2 -入力 + +> $\frac{1}{2} + \frac{3}{4} = \frac{10}{8}$ + +::: + +::: details 例2 + +**入力** + ``` 1 3 5 7 ``` -出力例 + +**出力** + ``` 22/21 ``` -### 入出力例 3 -入力 + +> $\frac{1}{3} + \frac{5}{7} = \frac{22}{21}$ + +::: + +::: details 例3 + +**入力** + ``` 1 0 1 0 ``` -出力例 + +**出力** + ``` ``` -$\frac{1}{0}$は存在しない。 -:::spoiler Answer +> 0除算は定義されないため、$\frac{1}{0}$は存在しません。 + +::: + +### ヒント + +::: details ヒント1 +今回は約分が必要ないので、最小公倍数を求める必要はありません。素直に掛け算で分母を求めてしまってよいでしょう。 +::: + +### 解答例 + +::: tip 解答例1 + +::: spoiler クリックして展開 ```cpp #include using namespace std; @@ -38,12 +77,19 @@ using namespace std; int main() { int a, b, c ,d; cin >> a >> b >> c >> d; + + // 分母が0でないなら if (b != 0 && d != 0) { + // 分母を計算 (今回は約分が不要なため、最小公倍数でなくともよい) int denominator = b * d; + + // 分子を計算 int numerator = a * d + c * b; + + // 結果を出力 cout << numerator << "/" << denominator << endl; } } ``` -なお、約分をしたい場合は`std::gcd`などを使って最小公倍数を得ることができる。 +なお、約分をしたい場合は`std::gcd`などを使って最小公倍数を得ることができます。 ::: diff --git a/docs/text/chapter-3/practice/int128.md b/docs/text/chapter-3/practice/int128.md index 55834dff..e4174aeb 100644 --- a/docs/text/chapter-3/practice/int128.md +++ b/docs/text/chapter-3/practice/int128.md @@ -1,9 +1,36 @@ # 3-B1. int128 -入力からint型の非負整数値を1つ受け取り、$10^{25}$倍して出力しよう。 +入力から`int`型の非負整数値を1つ受け取り、$10^{25}$倍して出力しよう。 -:::spoiler Answer -この問題では、出力は常に$10^{25}$以上となるため、通常のint型を使うとオーバーフローしてしまう。 +### 入力/出力例 + +::: details 例1 + +**入力** + +``` +5 +``` + +**出力** + +``` +50000000000000000000000000 +``` + +::: + +### ヒント + +::: details ヒント1 +この問題では出力は常に$10^{25}$以上となるため、通常の`int`型を使うとオーバーフローしてしまいます。数値ではなく、別の方法で扱うことはできないでしょうか...? +::: + +### 解答例 + +::: tip 解答例1 + +::: spoiler クリックして展開 ```cpp #include @@ -12,14 +39,18 @@ using namespace std; int main() { int input_number; cin >> input_number; + + // 文字列として必要な0を追加することでオーバーフローを回避 cout << input_number << "0000000000000000000000000" << endl; } ``` ::: -:::spoiler 実は... +::: tip 実は... + +::: spoiler クリックして展開 -Clang++やG++などの一部のコンパイラは、int128型\(__int128)という\(通常の)int型より大きい値を扱うことが出来る型に対応しているため、今回の問題を掛け算として解くことができる。 +Clang++やG++などの一部のコンパイラは`int128`型\(`__int128`)という通常の`int`型より大きい値を扱うことが出来る型に対応しているため、今回の問題を掛け算として解くことができる。 ::: diff --git a/docs/text/chapter-4/practice/do-not-fail.md b/docs/text/chapter-4/practice/do-not-fail.md index d16ecb98..734ee482 100644 --- a/docs/text/chapter-4/practice/do-not-fail.md +++ b/docs/text/chapter-4/practice/do-not-fail.md @@ -1,24 +1,75 @@ # DO NOT FAIL + 入力された複数の点数を受け取って、59点以下なら`Failed`と出力しよう。また、`-1`が入力されたら`Passed!`と出力して終了しよう。 -::: spoiler Answer +### 入力/出力例 + +::: details 例1 + +**入力** + +``` +59 +72 +31 +-1 +``` + +**出力** + +``` +Failed +Failed +Passed! +``` + +> 72の入力に対しては出力を行いません。 +::: + +### ヒント + + +::: details ヒント1 +`while (true)`とすることで、明示的に`break`しない限り終了しないループを実装することができます。 + +```cpp +// これは絶対に終了しない (無限ループ) +while(true) { +} + +while(true) { + // 適当な条件でbreakを実行することでループを抜けることが可能 + if (some_condition) { + break; + } +} +``` +::: + +### 解答例 + +::: tip 解答例1 + +::: spoiler クリックして展開 ```cpp #include -#include using namespace std; int main() { while(true) { int score; cin >> score; + if (score == -1) { cout << "Passed!" << endl; break; } + if (score < 60) { cout << "Failed" << endl; } } + return 0; } ``` diff --git a/docs/text/chapter-4/practice/fibonatti.md b/docs/text/chapter-4/practice/fibonatti.md index 6bf35e91..e0031964 100644 --- a/docs/text/chapter-4/practice/fibonatti.md +++ b/docs/text/chapter-4/practice/fibonatti.md @@ -4,20 +4,66 @@ ただし、フィボナッチ数列は $\{1,1,2,...\}$ とします。 -:::spoiler Hint 1 -$F_{n}=F_{n-1}+F_{n-2}$をfor文で計算しよう。 +### 入力/出力例 + +::: details 例1 + +**入力** + +``` +4 +``` + +**出力** + +``` +3 +``` + +> $F_4 = 3$ + +::: + +::: details 例2 + +**入力** + +``` +6 +``` + +**出力** + +``` +8 +``` + +> $F_6 = 8$ + ::: -:::spoiler Hint 2 + +### ヒント + +::: details ヒント1 +$F_{n}=F_{n-1}+F_{n-2}$を`for`文で計算しよう。 +::: + +::: details ヒント2 $F_{n-1}$ と $F_{n-2}$を持つ変数`latest`、`second_latest`を作り、ループの中で漸化式を満たすように更新していこう。 ::: -:::spoiler Hint 3 -`latest`と`second_latest`を同時に更新することはできないので、一時的な変数`next`も使おう。 +::: details ヒント3 +`latest`と`second_latest`を同時に更新することはできないので、一時的な変数(`next`など)を使って保持しておこう。 ::: -:::spoiler Answer +### 解答例 + +::: tip 解答例1 + +::: spoiler クリックして展開 for文を使うことでフィボナッチ数列の$N$番目を求めることができる。 + ```cpp #include using namespace std; @@ -29,6 +75,8 @@ int main() { for (int i = 2; i <= n; i++) { // i番目を計算 int next = second_latest + latest; + + // 最新の値を更新 second_latest = latest; latest = next; } @@ -36,7 +84,12 @@ int main() { } ``` -別解: `.push_back`を用いて、フィボナッチ数列の各値を配列に格納していく方法もあります。 +::: + +::: tip 解答例2 + +::: spoiler クリックして展開 +`.push_back`を用いて、フィボナッチ数列の各値を配列に格納していく方法もあります。 ```cpp #include diff --git a/docs/text/chapter-4/practice/fizz-buzz-2d.md b/docs/text/chapter-4/practice/fizz-buzz-2d.md index 1c48799d..549c5de4 100644 --- a/docs/text/chapter-4/practice/fizz-buzz-2d.md +++ b/docs/text/chapter-4/practice/fizz-buzz-2d.md @@ -1,4 +1,5 @@ # fizz-buzz 2D + 整数 $H, W$ が渡されるので、$H\times W$ の二次元配列 $a_{i,j}\ (1\leq i\leq H, 1\leq j\leq W)$ を出力しよう。 ただし、$a_{i,j}$ は @@ -8,13 +9,19 @@ - $i$ は3の倍数でなく、$j$ が5の倍数のとき、`Bu` (文字列) - $i$ が3の倍数で、$j$ が5の倍数のとき、`FB` (文字列) -### 出力例 +### 入力/出力例 + +::: details 例1 + +**入力** -入力 `7 6` に対する出力の例 +``` +7 6 +``` -$i$ 行 $j$ 列に $a_{i,j}$ を出力している。 +**出力** -```text +``` 1 2 3 4 Bu 6 2 4 6 8 Bu 12 Fi Fi Fi Fi FB Fi @@ -24,12 +31,16 @@ Fi Fi Fi Fi FB Fi 7 14 21 28 Bu 42 ``` -:::tip 出力の幅を揃える方法 -数字 ( $i\times j$ ) や 文字 (`Fi`, `Bu`, `FB`) を出力した後に `\t` を出力すると、数字や文字が良い感じにそろいます。 +> $i$ 行 $j$ 列に $a_{i,j}$ を出力している。 + +--- + +::: tip 出力の幅を揃える方法 +数字 ( $i\times j$ ) や 文字 (`Fi`, `Bu`, `FB`) を出力した後に `\t` を出力すると数字や文字を揃えることができます。 + +例えば、以下のコードで上記のような出力例を再現できます。 -例えば、以下のコードで上記のような出力例を再現できる。 ```cpp -#include #include using namespace std; @@ -45,9 +56,12 @@ int main() { ``` ::: -:::spoiler Answer +### 解答例 + +::: tip 解答例1 + +::: spoiler クリックして展開 ```cpp -#include #include using namespace std; diff --git a/docs/text/chapter-4/practice/lower-or-upper.md b/docs/text/chapter-4/practice/lower-or-upper.md index bbedc409..c19a103f 100644 --- a/docs/text/chapter-4/practice/lower-or-upper.md +++ b/docs/text/chapter-4/practice/lower-or-upper.md @@ -1,14 +1,55 @@ # lower or UPPER -アルファベット1文字が渡されたとき、それが大文字なら"UPPERCASE"、小文字なら"lowercase"と出力しよう -::: spoiler Hint -`char`型は1byteの整数値のため、互いに大小関係がある。 +アルファベット1文字が渡されたとき、それが大文字なら"UPPERCASE"、小文字なら"lowercase"と出力しよう。 + +### 入力/出力例 + +::: details 例1 + +**入力** + +``` +a +``` + +**出力** + +``` +lowercase +``` + +::: + +::: details 例2 + +**入力** + +``` +B +``` + +**出力** + +``` +UPPERCASE +``` + +::: + +### ヒント + +::: details ヒント1 +`char`型は1byteの整数値のため、互いに大小関係があります。ASCIIコードの話を思い出してみましょう。 ::: -::: spoiler Answer -`char`型は`<`、`>`、`<=`、`>=`などで大小を比較することができる。 +### 解答例 + +::: tip 解答例1 + +::: spoiler クリックして展開 +`char`型は各文字コードに対応する整数値のため、`<`、`>`、`<=`、`>=`などで大小を比較することができます。 + ```cpp -#include #include using namespace std; @@ -22,4 +63,6 @@ int main() { cout << "UPPERCASE" << endl; } return 0; -} \ No newline at end of file +} +``` +::: \ No newline at end of file diff --git a/docs/text/chapter-5/practice/divide-each-difficulty.md b/docs/text/chapter-5/practice/divide-each-difficulty.md index bbb1a8ae..24a255b1 100644 --- a/docs/text/chapter-5/practice/divide-each-difficulty.md +++ b/docs/text/chapter-5/practice/divide-each-difficulty.md @@ -1,5 +1,7 @@ # Divide each difficulty + 以下の$n \leq 7$を受け取って$n \times n$の行列$a_{i,j}=Fibonatti_{ij}$を出力するプログラムの、フィボナッチ数列の解を求める部分を別の関数`int fibonatti(int index);`に分離してみよう。 + ```cpp:line-numbers #include using namespace std; @@ -25,8 +27,12 @@ int main() { } ``` -::: spoiler Hint +### ヒント + +::: details ヒント1 + 下のコードの`// ここにフィボナッチ数列の計算を実装しよう`の部分を実装してみよう。 + ```cpp:line-numbers #include using namespace std; @@ -51,7 +57,11 @@ int main() { ``` ::: -::: spoiler Answer +### 解答例 + +::: tip 解答例1 + +::: spoiler クリックして展開 ```cpp:line-numbers #include diff --git a/docs/text/chapter-5/practice/plus-equal.md b/docs/text/chapter-5/practice/plus-equal.md index 05edf413..ea1282b4 100644 --- a/docs/text/chapter-5/practice/plus-equal.md +++ b/docs/text/chapter-5/practice/plus-equal.md @@ -1,4 +1,5 @@ # Operator+= + `int`型の`a`と`b`について`a`に`b`を足す操作である ```cpp @@ -7,11 +8,16 @@ a += b; で用いる`+=`演算子と同じ働きをする関数を書こう。 -::: spoiler Hint 1 +### ヒント + +::: details ヒント1 `a`を参照渡しで受け取ることで、`a`の値を書き換えることができる。 ::: -::: spoiler Answer +### 解答例 + +::: tip 解答例1 +::: spoiler クリックして展開 ```cpp:line-numbers void compound_assigned_plus(int& lhs, int rhs) { lhs = lhs + rhs; diff --git a/docs/text/chapter-6/practice/order.md b/docs/text/chapter-6/practice/order.md index e5703f22..436a762c 100644 --- a/docs/text/chapter-6/practice/order.md +++ b/docs/text/chapter-6/practice/order.md @@ -16,8 +16,6 @@ 1. 番号が与えられたときに、その商品の名前、値段、スペックを表示する。 2. 値段が与えられたときに、その**値段以下**の全ての商品の名前、値段、スペックをすべて表示する。 - - ```cpp:line-numbers #include #include @@ -30,37 +28,52 @@ struct Item { int main() { vector items = { Item{5000, "机", "それなり"}, - ... + // ここにアイテムを追加 }; // ここに 1番 2番を 解けるプログラムを書く } ``` -## 入出力例 -```text -[Input 1] +### 入力/出力例 + +::: details 例1 + +**入力** + +``` 1 0 ``` -```text -[Output 1] +**出力** + +``` 机 5000 それなり ``` -```text -[Input 2] +::: + +::: details 例2 + +**入力** + +``` 2 100001 ``` -```txt -[Output 2] +**出力** + +``` 机 5000 それなり チョコ 100 おいしい 安いPC 100000 たかい ``` -::: spoiler Hint +::: + +### ヒント + +::: details ヒント1 `Item`構造体を宣言して、以下のメンバー変数とメソッドを実装しよう。 - `price`(`int`型) - `name`(`string`型) @@ -68,7 +81,15 @@ int main() { - `print`メソッド ::: -::: spoiler Answer +::: details ヒント2 +クエリとして入力される`1`または`2`の値に応じて、条件に合致するアイテムの情報を出力しよう。 +::: + +### 解答例 + +::: tip 解答例1 + +::: spoiler クリックして展開 ```cpp:line-numbers #include #include diff --git a/docs/text/chapter-7/practice/sort.md b/docs/text/chapter-7/practice/sort.md index af7b7105..e7e2bc68 100644 --- a/docs/text/chapter-7/practice/sort.md +++ b/docs/text/chapter-7/practice/sort.md @@ -33,7 +33,10 @@ int main() { 結果を考えてみたらコピーして実行してみましょう。 -::: spoiler 解答 +### 解答例 + +::: tip 解答例1 +::: spoiler クリックして展開 ```txt -400 @@ -52,6 +55,7 @@ int main() { このループを繰り返すことで、ソートすることができます。 -::: tip +--- + これはバブルソート ([バブルソート: wikipedia](https://ja.wikipedia.org/wiki/バブルソート))と呼ばれ一番基本的なソートアルゴリズムと知られています。ただし、計算量 $O(n^2)$ で効率が悪いです。(オーダー記法は 8 章の [計算量と実行時間](../../chapter-8/complexity.md) を参照。) ::: diff --git a/docs/text/chapter-8/practice/capsulate-user.md b/docs/text/chapter-8/practice/capsulate-user.md index 57ead137..3c5a1344 100644 --- a/docs/text/chapter-8/practice/capsulate-user.md +++ b/docs/text/chapter-8/practice/capsulate-user.md @@ -4,9 +4,12 @@ <<<@/text/chapter-6/struct.cpp#define{cpp:line-numbers} +### 解答例 -::: spoiler Answer -値の設定をするメンバ関数と取得をするメンバ関数(それぞれ、setter,getterと呼ばれます)を用意すると、隠蔽されたメンバ変数へアクセスすることができる。 +::: tip 解答例1 + +::: spoiler クリックして展開 +値の設定をするメンバ関数と取得をするメンバ関数(それぞれsetter/getterと呼ばれます)を用意すると、隠蔽されたメンバ変数へアクセスすることができる。 ```cpp:line-numbers // setter, getterを用いた実装 #include @@ -46,9 +49,13 @@ class CapsulatedMember { return grade; } }; +::: -``` +::: tip 解答例2 + +::: spoiler クリックして展開 メンバ変数の参照を返すメンバ関数でも良い。 + ```cpp:line-numbers // 参照渡しを用いた実装 #include diff --git a/docs/text/chapter-8/practice/exponentation.md b/docs/text/chapter-8/practice/exponentation.md index 6984b373..58e0c7d2 100644 --- a/docs/text/chapter-8/practice/exponentation.md +++ b/docs/text/chapter-8/practice/exponentation.md @@ -6,7 +6,6 @@ $c \equiv a ^ b \mod{M} | 0 \leq c < M$ を満たす$c$を、再帰関数を使って出力しよう。 - - 基礎課題 - $2 \leq a < 10^4$ @@ -18,8 +17,11 @@ $c \equiv a ^ b \mod{M} | 0 \leq c < M$ - $0 \leq b < 10^{18}$ - $M = 998244353$ +### 解答例 + +::: tip 解答例 - 基礎課題 -:::spoiler Answer 基礎課題 +::: spoiler クリックして展開 ```cpp // 愚直な再帰関数を用いた実装 @@ -43,7 +45,10 @@ int main() { ``` ::: -:::spoiler Answer 発展課題 +::: tip 解答例 - 発展課題 + +::: spoiler クリックして展開 + ```cpp // メモ化再帰を用いたダブリングの実装 #include