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

回答編集履歴

5

バグの修正

2017/05/18 10:57

投稿

majiponi
majiponi

スコア1722

answer CHANGED
@@ -54,12 +54,8 @@
54
54
 
55
55
  void print(int* digits, int size)
56
56
  {
57
- int i, j, count = 0;
57
+ int i;
58
- for(i = 0; i < size; i++){
59
- if(digits[i]) count = i;
60
- }
61
- printf("%d", digits[count]);
62
- for(j = count - 1; j >= 0; j--) printf("%0*d", LOGBASE, digits[j]);
58
+ for(i = size - 1; i >= 0; i--) printf("%0*d", LOGBASE, digits[i]);
63
59
  }
64
60
 
65
61
 

4

誤字修正

2017/05/18 10:57

投稿

majiponi
majiponi

スコア1722

answer CHANGED
@@ -6,7 +6,7 @@
6
6
  そもそも、iで回すfor文は必要?
7
7
  なぜ二重ループ?
8
8
 
9
- 追記: 我流で書いてみた。
9
+ 追記: 我流で書いてみた。電車の中からスマホでぱぱっと書いただけなのでテストしてませんorz
10
10
  ```C
11
11
  #include <stdio.h>
12
12
  #define countof(arr) (sizeof(arr)/sizeof(arr[0]))
@@ -49,7 +49,7 @@
49
49
  {
50
50
  int i;
51
51
  set(digits, size, 1);
52
- for(i = 1; i <= n; i++) mul(digits, size, n);
52
+ for(i = 1; i <= n; i++) mul(digits, size, i);
53
53
  }
54
54
 
55
55
  void print(int* digits, int size)

3

修正例の追加

2017/05/18 10:44

投稿

majiponi
majiponi

スコア1722

answer CHANGED
@@ -4,4 +4,63 @@
4
4
  修正方法は自分で考えてみてください(簡単なのでトレーニングと思ってやってみてください、ヒントは書きました)。
5
5
 
6
6
  そもそも、iで回すfor文は必要?
7
- なぜ二重ループ?
7
+ なぜ二重ループ?
8
+
9
+ 追記: 我流で書いてみた。
10
+ ```C
11
+ #include <stdio.h>
12
+ #define countof(arr) (sizeof(arr)/sizeof(arr[0]))
13
+ #define BASE 10000
14
+ #define LOGBASE 4
15
+
16
+ void set(int* digits, int size, int value);
17
+ void mul(int* digits, int size, int n);
18
+ void fact(int* digits, int size, int n);
19
+ void printdigits(int* digits, int size);
20
+
21
+ int main(void)
22
+ {
23
+ int digits[20];
24
+ int n = 53;
25
+ fact(digits, countof(digits), n);
26
+ printf("%d!=", n);
27
+ printdigits(digits, countof(digits));
28
+ printf("\n");
29
+ }
30
+
31
+ void set(int* digits, int size, int value)
32
+ {
33
+ int i;
34
+ process[0] = value;
35
+ for(i=1; i < size; i++) process[i] = 0;
36
+ }
37
+
38
+ void mul(int* digits, int size, int n)
39
+ {
40
+ int i, m = 0;
41
+ for(i = 0; i < size; i++){
42
+ m += digits[i] * n;
43
+ digits[i] = m % BASE;
44
+ m /= BASE;
45
+ }
46
+ }
47
+
48
+ void fact(int* digits, int n)
49
+ {
50
+ int i;
51
+ set(digits, size, 1);
52
+ for(i = 1; i <= n; i++) mul(digits, size, n);
53
+ }
54
+
55
+ void print(int* digits, int size)
56
+ {
57
+ int i, j, count = 0;
58
+ for(i = 0; i < size; i++){
59
+ if(digits[i]) count = i;
60
+ }
61
+ printf("%d", digits[count]);
62
+ for(j = count - 1; j >= 0; j--) printf("%0*d", LOGBASE, digits[j]);
63
+ }
64
+
65
+
66
+ ```

2

誤字修正

2017/05/18 10:42

投稿

majiponi
majiponi

スコア1722

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

1

全面修正

2017/05/17 12:18

投稿

majiponi
majiponi

スコア1722

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