回答編集履歴

5

バグの修正

2017/05/18 10:57

投稿

majiponi
majiponi

スコア1720

test CHANGED
@@ -110,17 +110,9 @@
110
110
 
111
111
  {
112
112
 
113
- int i, j, count = 0;
113
+ int i;
114
114
 
115
- for(i = 0; i < size; i++){
116
-
117
- if(digits[i]) count = i;
118
-
119
- }
120
-
121
- printf("%d", digits[count]);
122
-
123
- for(j = count - 1; j >= 0; j--) printf("%0*d", LOGBASE, digits[j]);
115
+ for(i = size - 1; i >= 0; i--) printf("%0*d", LOGBASE, digits[i]);
124
116
 
125
117
  }
126
118
 

4

誤字修正

2017/05/18 10:57

投稿

majiponi
majiponi

スコア1720

test CHANGED
@@ -14,7 +14,7 @@
14
14
 
15
15
 
16
16
 
17
- 追記: 我流で書いてみた。
17
+ 追記: 我流で書いてみた。電車の中からスマホでぱぱっと書いただけなのでテストしてませんorz
18
18
 
19
19
  ```C
20
20
 
@@ -100,7 +100,7 @@
100
100
 
101
101
  set(digits, size, 1);
102
102
 
103
- for(i = 1; i <= n; i++) mul(digits, size, n);
103
+ for(i = 1; i <= n; i++) mul(digits, size, i);
104
104
 
105
105
  }
106
106
 

3

修正例の追加

2017/05/18 10:44

投稿

majiponi
majiponi

スコア1720

test CHANGED
@@ -11,3 +11,121 @@
11
11
  そもそも、iで回すfor文は必要?
12
12
 
13
13
  なぜ二重ループ?
14
+
15
+
16
+
17
+ 追記: 我流で書いてみた。
18
+
19
+ ```C
20
+
21
+ #include <stdio.h>
22
+
23
+ #define countof(arr) (sizeof(arr)/sizeof(arr[0]))
24
+
25
+ #define BASE 10000
26
+
27
+ #define LOGBASE 4
28
+
29
+
30
+
31
+ void set(int* digits, int size, int value);
32
+
33
+ void mul(int* digits, int size, int n);
34
+
35
+ void fact(int* digits, int size, int n);
36
+
37
+ void printdigits(int* digits, int size);
38
+
39
+
40
+
41
+ int main(void)
42
+
43
+ {
44
+
45
+ int digits[20];
46
+
47
+ int n = 53;
48
+
49
+ fact(digits, countof(digits), n);
50
+
51
+ printf("%d!=", n);
52
+
53
+ printdigits(digits, countof(digits));
54
+
55
+ printf("\n");
56
+
57
+ }
58
+
59
+
60
+
61
+ void set(int* digits, int size, int value)
62
+
63
+ {
64
+
65
+ int i;
66
+
67
+ process[0] = value;
68
+
69
+ for(i=1; i < size; i++) process[i] = 0;
70
+
71
+ }
72
+
73
+
74
+
75
+ void mul(int* digits, int size, int n)
76
+
77
+ {
78
+
79
+ int i, m = 0;
80
+
81
+ for(i = 0; i < size; i++){
82
+
83
+ m += digits[i] * n;
84
+
85
+ digits[i] = m % BASE;
86
+
87
+ m /= BASE;
88
+
89
+ }
90
+
91
+ }
92
+
93
+
94
+
95
+ void fact(int* digits, int n)
96
+
97
+ {
98
+
99
+ int i;
100
+
101
+ set(digits, size, 1);
102
+
103
+ for(i = 1; i <= n; i++) mul(digits, size, n);
104
+
105
+ }
106
+
107
+
108
+
109
+ void print(int* digits, int size)
110
+
111
+ {
112
+
113
+ int i, j, count = 0;
114
+
115
+ for(i = 0; i < size; i++){
116
+
117
+ if(digits[i]) count = i;
118
+
119
+ }
120
+
121
+ printf("%d", digits[count]);
122
+
123
+ for(j = count - 1; j >= 0; j--) printf("%0*d", LOGBASE, digits[j]);
124
+
125
+ }
126
+
127
+
128
+
129
+
130
+
131
+ ```

2

誤字修正

2017/05/18 10:42

投稿

majiponi
majiponi

スコア1720

test CHANGED
@@ -2,6 +2,12 @@
2
2
 
3
3
 
4
4
 
5
- バグはprint関数の中に2点あります。1つ目は初期化されていないローカル変数countを利用していること、2つ目は二重になっているfor文で、同じsという変数をループカウンタに利用していることです。
5
+ バグはprint関数の中に2点あります。1つ目は初期化されていないローカル変数countを利用していること、2つ目はfor文で、同じsという変数をループカウンタに利用していることです。
6
6
 
7
7
  修正方法は自分で考えてみてください(簡単なのでトレーニングと思ってやってみてください、ヒントは書きました)。
8
+
9
+
10
+
11
+ そもそも、iで回すfor文は必要?
12
+
13
+ なぜ二重ループ?

1

全面修正

2017/05/17 12:18

投稿

majiponi
majiponi

スコア1720

test CHANGED
@@ -1 +1,7 @@
1
+ can110さんの指摘する点もバグですが…
2
+
3
+
4
+
1
- print関数count変数どのように初期化されていますか? kaijou関数とは別のスコープなの、値は引き継げませんよ?
5
+ バグはprint関数の中に2点あります。1つ目は初期化されていないローカル変数countを利用しているこ、2つ目二重になっているfor文で、同じsという変数をループカウンタに利用していることす。
6
+
7
+ 修正方法は自分で考えてみてください(簡単なのでトレーニングと思ってやってみてください、ヒントは書きました)。