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

回答編集履歴

2

補足を追加

2020/07/17 23:46

投稿

Daregada
Daregada

スコア11990

answer CHANGED
@@ -15,4 +15,49 @@
15
15
 
16
16
  とすれば、20の階乗までは正しい値が(整数値として)得られます。あとは、doubleにキャストするときの有効桁数に影響されますね。
17
17
 
18
- なお、`n`が0や1のときはfor文の継続条件を満たさないので(繰り返し処理は起こらないので)、直前でif文で処理する必要はなく、そのまま末尾のreturnで正しい値(1)を返せます。むしろ、`n < 0`や`n > 20`のときのエラー処理を加えたほうがいいかも。
18
+ なお、`n`が0や1のときはfor文の継続条件を満たさないので(繰り返し処理は起こらないので)、直前でif文で処理する必要はなく、そのまま末尾のreturnで正しい値(1)を返せます。むしろ、`n < 0`や`n > 20`のときのエラー処理を加えたほうがいいかも。
19
+
20
+ 修正: 検証用に書いていたコード
21
+
22
+ ```C
23
+ #include <stdio.h>
24
+ #include <stdlib.h>
25
+ long long int fact(int n);
26
+
27
+ int main(void) {
28
+ char line[20];
29
+
30
+ while (1) {
31
+ printf("number=");
32
+ fgets(line, sizeof(line), stdin);
33
+ int n = strtol(line, NULL, 10);
34
+
35
+ if (n < 0) {
36
+ break;
37
+ }
38
+
39
+ double k = 0.0;
40
+ while (n >= 0) {
41
+ k += 1.0 / fact(n);
42
+ n--;
43
+ }
44
+
45
+ printf("e=%.15lf\n", k);
46
+ }
47
+
48
+ return 0;
49
+ }
50
+
51
+ long long int fact(int n) {
52
+ long long int answer = 1;
53
+ if (n < 0 || n > 20) {
54
+ fprintf(stderr, "factの引数%dが範囲外\n", n);
55
+ exit(1);
56
+ }
57
+ while (n > 1) {
58
+ answer *= n;
59
+ n--;
60
+ }
61
+ return answer;
62
+ }
63
+ ```

1

補足を追加

2020/07/17 23:46

投稿

Daregada
Daregada

スコア11990

answer CHANGED
@@ -13,6 +13,6 @@
13
13
  }
14
14
  ```
15
15
 
16
- とすれば、20の階乗までは正しい値が得られます。
16
+ とすれば、20の階乗までは正しい値が(整数値として)得られます。あとは、doubleにキャストするときの有効桁数に影響されますね。
17
17
 
18
18
  なお、`n`が0や1のときはfor文の継続条件を満たさないので(繰り返し処理は起こらないので)、直前でif文で処理する必要はなく、そのまま末尾のreturnで正しい値(1)を返せます。むしろ、`n < 0`や`n > 20`のときのエラー処理を加えたほうがいいかも。