回答編集履歴

2

補足を追加

2020/07/17 23:46

投稿

Daregada
Daregada

スコア11990

test CHANGED
@@ -33,3 +33,93 @@
33
33
 
34
34
 
35
35
  なお、`n`が0や1のときはfor文の継続条件を満たさないので(繰り返し処理は起こらないので)、直前でif文で処理する必要はなく、そのまま末尾のreturnで正しい値(1)を返せます。むしろ、`n < 0`や`n > 20`のときのエラー処理を加えたほうがいいかも。
36
+
37
+
38
+
39
+ 修正: 検証用に書いていたコード
40
+
41
+
42
+
43
+ ```C
44
+
45
+ #include <stdio.h>
46
+
47
+ #include <stdlib.h>
48
+
49
+ long long int fact(int n);
50
+
51
+
52
+
53
+ int main(void) {
54
+
55
+ char line[20];
56
+
57
+
58
+
59
+ while (1) {
60
+
61
+ printf("number=");
62
+
63
+ fgets(line, sizeof(line), stdin);
64
+
65
+ int n = strtol(line, NULL, 10);
66
+
67
+
68
+
69
+ if (n < 0) {
70
+
71
+ break;
72
+
73
+ }
74
+
75
+
76
+
77
+ double k = 0.0;
78
+
79
+ while (n >= 0) {
80
+
81
+ k += 1.0 / fact(n);
82
+
83
+ n--;
84
+
85
+ }
86
+
87
+
88
+
89
+ printf("e=%.15lf\n", k);
90
+
91
+ }
92
+
93
+
94
+
95
+ return 0;
96
+
97
+ }
98
+
99
+
100
+
101
+ long long int fact(int n) {
102
+
103
+ long long int answer = 1;
104
+
105
+ if (n < 0 || n > 20) {
106
+
107
+ fprintf(stderr, "factの引数%dが範囲外\n", n);
108
+
109
+ exit(1);
110
+
111
+ }
112
+
113
+ while (n > 1) {
114
+
115
+ answer *= n;
116
+
117
+ n--;
118
+
119
+ }
120
+
121
+ return answer;
122
+
123
+ }
124
+
125
+ ```

1

補足を追加

2020/07/17 23:46

投稿

Daregada
Daregada

スコア11990

test CHANGED
@@ -28,7 +28,7 @@
28
28
 
29
29
 
30
30
 
31
- とすれば、20の階乗までは正しい値が得られます。
31
+ とすれば、20の階乗までは正しい値が(整数値として)得られます。あとは、doubleにキャストするときの有効桁数に影響されますね。
32
32
 
33
33
 
34
34