回答編集履歴

5

修正

2020/08/31 13:32

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -84,7 +84,7 @@
84
84
 
85
85
  {
86
86
 
87
- int array[N] = {};
87
+ int array[N] = {0};
88
88
 
89
89
  int mod = 1;
90
90
 

4

修正

2020/08/31 13:32

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -9,3 +9,129 @@
9
9
  + memset(numArray, 0, sizeof(numArray));
10
10
 
11
11
  ```
12
+
13
+
14
+
15
+ ## 追記
16
+
17
+
18
+
19
+ 修正依頼欄で他のSoeiさんが指定してくださってますが、`i % 2 == 0 or i % 5 == 0` で循環節の長さ0とするのはおかしいですね。
20
+
21
+ 反例: 1/12 = 0.08333333333
22
+
23
+ 反例: 1/90 = 0.01111111111
24
+
25
+
26
+
27
+
28
+
29
+ ```python
30
+
31
+ #include <stdio.h>
32
+
33
+ #include <string.h>
34
+
35
+
36
+
37
+ #define N 100
38
+
39
+
40
+
41
+ /**
42
+
43
+ * @brief 値 value が配列 array に見つかった場合はそのインデックス、見つからなかった場合は -1 を返す。
44
+
45
+ * @param[in] array 配列
46
+
47
+ * @param[in] size 配列のサイズ
48
+
49
+ * @param[in] value 検索する値
50
+
51
+ * @return インデックス
52
+
53
+ */
54
+
55
+ int find_index(const int array[], int size, int value)
56
+
57
+ {
58
+
59
+ int i = 0;
60
+
61
+ while (i < size && array[i] != value)
62
+
63
+ ++i;
64
+
65
+
66
+
67
+ return i == size ? -1 : i;
68
+
69
+ }
70
+
71
+
72
+
73
+ /**
74
+
75
+ * @brief 1 / value の循環節の長さを返す。
76
+
77
+ * @param value 値
78
+
79
+ * @return 循環節の長さ
80
+
81
+ */
82
+
83
+ int func(int value)
84
+
85
+ {
86
+
87
+ int array[N] = {};
88
+
89
+ int mod = 1;
90
+
91
+ int i, j;
92
+
93
+
94
+
95
+ for (i = 0; i < N; ++i) {
96
+
97
+ mod %= value;
98
+
99
+ if (mod == 0)
100
+
101
+ return 0; // 割り切れた場合、循環節の長さは0
102
+
103
+
104
+
105
+ j = find_index(array, i, mod);
106
+
107
+ if (j != -1)
108
+
109
+ return i - j; // 過去に同じ余りがあった場合は j, j + 1, ..., i - 1 までが循環節
110
+
111
+
112
+
113
+ array[i] = mod;
114
+
115
+ mod *= 10;
116
+
117
+ }
118
+
119
+ }
120
+
121
+
122
+
123
+ int main()
124
+
125
+ {
126
+
127
+ // 1 ~ N の循環節の長さを出力する。
128
+
129
+ for (int i = 1; i <= N; i++)
130
+
131
+ printf("%d: %d\n", i, func(i));
132
+
133
+ }
134
+
135
+
136
+
137
+ ```

3

修正

2020/08/30 16:20

投稿

tiitoi
tiitoi

スコア21956

test 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
 
4
4
 

2

修正

2020/08/30 13:45

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -1,6 +1,8 @@
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
3
 
4
+
5
+ ループ内の count = 0; の上に追加
4
6
 
5
7
  ```diff
6
8
 

1

修正

2020/08/30 13:44

投稿

tiitoi
tiitoi

スコア21956

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