teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

5

修正

2020/08/31 13:32

投稿

tiitoi
tiitoi

スコア21960

answer CHANGED
@@ -41,7 +41,7 @@
41
41
  */
42
42
  int func(int value)
43
43
  {
44
- int array[N] = {};
44
+ int array[N] = {0};
45
45
  int mod = 1;
46
46
  int i, j;
47
47
 

4

修正

2020/08/31 13:32

投稿

tiitoi
tiitoi

スコア21960

answer CHANGED
@@ -3,4 +3,67 @@
3
3
  ループ内の count = 0; の上に追加
4
4
  ```diff
5
5
  + memset(numArray, 0, sizeof(numArray));
6
+ ```
7
+
8
+ ## 追記
9
+
10
+ 修正依頼欄で他のSoeiさんが指定してくださってますが、`i % 2 == 0 or i % 5 == 0` で循環節の長さ0とするのはおかしいですね。
11
+ 反例: 1/12 = 0.08333333333
12
+ 反例: 1/90 = 0.01111111111
13
+
14
+
15
+ ```python
16
+ #include <stdio.h>
17
+ #include <string.h>
18
+
19
+ #define N 100
20
+
21
+ /**
22
+ * @brief 値 value が配列 array に見つかった場合はそのインデックス、見つからなかった場合は -1 を返す。
23
+ * @param[in] array 配列
24
+ * @param[in] size 配列のサイズ
25
+ * @param[in] value 検索する値
26
+ * @return インデックス
27
+ */
28
+ int find_index(const int array[], int size, int value)
29
+ {
30
+ int i = 0;
31
+ while (i < size && array[i] != value)
32
+ ++i;
33
+
34
+ return i == size ? -1 : i;
35
+ }
36
+
37
+ /**
38
+ * @brief 1 / value の循環節の長さを返す。
39
+ * @param value 値
40
+ * @return 循環節の長さ
41
+ */
42
+ int func(int value)
43
+ {
44
+ int array[N] = {};
45
+ int mod = 1;
46
+ int i, j;
47
+
48
+ for (i = 0; i < N; ++i) {
49
+ mod %= value;
50
+ if (mod == 0)
51
+ return 0; // 割り切れた場合、循環節の長さは0
52
+
53
+ j = find_index(array, i, mod);
54
+ if (j != -1)
55
+ return i - j; // 過去に同じ余りがあった場合は j, j + 1, ..., i - 1 までが循環節
56
+
57
+ array[i] = mod;
58
+ mod *= 10;
59
+ }
60
+ }
61
+
62
+ int main()
63
+ {
64
+ // 1 ~ N の循環節の長さを出力する。
65
+ for (int i = 1; i <= N; i++)
66
+ printf("%d: %d\n", i, func(i));
67
+ }
68
+
6
69
  ```

3

修正

2020/08/30 16:20

投稿

tiitoi
tiitoi

スコア21960

answer CHANGED
@@ -1,4 +1,4 @@
1
- `num_list = list(np.zeros(end_num, dtype=int))` に該当する処理がないです。[memset()](http://www9.plala.or.jp/sgwr-t/lib/memset.html) で `numArray` を初期化してください。
1
+ `num_list = list(np.zeros(end_num, dtype=int))` に該当する処理が C 言語のほうにはないです。[memset()](http://www9.plala.or.jp/sgwr-t/lib/memset.html) で `numArray` を初期化してください。
2
2
 
3
3
  ループ内の count = 0; の上に追加
4
4
  ```diff

2

修正

2020/08/30 13:45

投稿

tiitoi
tiitoi

スコア21960

answer CHANGED
@@ -1,5 +1,6 @@
1
- ループ内の count = 0; の上に追加 `num_list = list(np.zeros(end_num, dtype=int))` に該当する処理がないです。[memset()](http://www9.plala.or.jp/sgwr-t/lib/memset.html) で初期化してください。
1
+ `num_list = list(np.zeros(end_num, dtype=int))` に該当する処理がないです。[memset()](http://www9.plala.or.jp/sgwr-t/lib/memset.html) で `numArray` を初期化してください。
2
2
 
3
+ ループ内の count = 0; の上に追加
3
4
  ```diff
4
5
  + memset(numArray, 0, sizeof(numArray));
5
6
  ```

1

修正

2020/08/30 13:44

投稿

tiitoi
tiitoi

スコア21960

answer CHANGED
@@ -1,28 +1,5 @@
1
- 配列や変数は定義したら、初期化を忘れないようにましょう
1
+ ループ内の count = 0; の上に追加 `num_list = list(np.zeros(end_num, dtype=int))` に該当する処理がないです。[memset()](http://www9.plala.or.jp/sgwr-t/lib/memset.html) で初期化してください
2
2
 
3
3
  ```diff
4
- - int numArray[end_num + 1];
5
- + int numArray[end_num + 1] = {};
6
- ```
7
-
8
- ```diff
9
- - int outputArray[end_num + 1];
10
- + int outputArray[end_num + 1] = {};
11
- ```
12
-
13
- ループ内の count = 0; の上に追加 `num_list = list(np.zeros(end_num, dtype=int))` に該当する処理がない
14
-
15
- ```diff
16
4
  + memset(numArray, 0, sizeof(numArray));
17
- ```
5
+ ```
18
-
19
-
20
- ## 初期化方法
21
-
22
- 宣言時であれば以下で0で初期化可能
23
-
24
- ```
25
- int array[10] = {};
26
- ```
27
-
28
- あとから初期化する場合は[memset()](http://www9.plala.or.jp/sgwr-t/lib/memset.html)を使う。