回答編集履歴
3
+1の誤りを修正しました。4 * Nがあるのでループを1開始に戻しました。
test
CHANGED
@@ -8,19 +8,19 @@
|
|
8
8
|
|
9
9
|
int x;
|
10
10
|
|
11
|
-
|
11
|
+
long long Cp = 0; /*格子点の数*/
|
12
12
|
|
13
13
|
double pi; /*円周率*/
|
14
14
|
|
15
|
-
for (x =
|
15
|
+
for (x = 1; x < N; x++) {
|
16
16
|
|
17
|
-
Cp += ((long)sqrt((double)N * N - (double)x * x)
|
17
|
+
Cp += ((long)sqrt((double)N * N - (double)x * x));
|
18
18
|
|
19
19
|
}
|
20
20
|
|
21
|
-
Cp = (4 * Cp + 4 * N); /*他の象限の扇形+軸の格子点+原点*/
|
21
|
+
Cp = ((long)4 * Cp + 4 * N + 1); /*他の象限の扇形+軸の格子点+原点*/
|
22
22
|
|
23
|
-
pi = (Cp / ((double)N * N)); /* 面積/半径の二乗 */
|
23
|
+
pi = ((double)Cp / ((double)N * N)); /* 面積/半径の二乗 */
|
24
24
|
|
25
25
|
return pi;
|
26
26
|
|
2
Cpを格子点の数になるよう修正しました。
test
CHANGED
@@ -14,7 +14,7 @@
|
|
14
14
|
|
15
15
|
for (x = 0; x < N; x++) {
|
16
16
|
|
17
|
-
Cp += (sqrt((double)N * N - (double)x * x));
|
17
|
+
Cp += ((long)sqrt((double)N * N - (double)x * x) + 1); //x軸上の格子点分を+1
|
18
18
|
|
19
19
|
}
|
20
20
|
|
1
doubleでの計算に変更しました。
test
CHANGED
@@ -1,43 +1,29 @@
|
|
1
|
-
|
1
|
+
xとNは整数のままとして、その他をdoubleで計算するようにしました。
|
2
2
|
|
3
3
|
|
4
4
|
|
5
|
-
ループの初期値は0です。これで半径の高さが得られます。
|
6
|
-
|
7
5
|
```C
|
8
6
|
|
9
|
-
|
7
|
+
double CountPoints(int N) { /*格子点の数を計算し円周率を計算する関数*/
|
10
8
|
|
11
|
-
|
9
|
+
int x;
|
12
10
|
|
11
|
+
double Cp = 0; /*格子点の数*/
|
12
|
+
|
13
|
+
double pi; /*円周率*/
|
14
|
+
|
13
|
-
|
15
|
+
for (x = 0; x < N; x++) {
|
16
|
+
|
17
|
+
Cp += (sqrt((double)N * N - (double)x * x));
|
18
|
+
|
19
|
+
}
|
20
|
+
|
21
|
+
Cp = (4 * Cp + 4 * N); /*他の象限の扇形+軸の格子点+原点*/
|
22
|
+
|
23
|
+
pi = (Cp / ((double)N * N)); /* 面積/半径の二乗 */
|
24
|
+
|
25
|
+
return pi;
|
26
|
+
|
27
|
+
}
|
14
28
|
|
15
29
|
```
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
ループの終了条件が「x < N」でこの判定は常に真でなので不要です。
|
20
|
-
|
21
|
-
```C
|
22
|
-
|
23
|
-
if(N * N - x * x >= 0){ /*円周で囲まれる部分の格子点を全てたす*/
|
24
|
-
|
25
|
-
```
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
原点となっている1を加算する理由がわからなかったのですが、原点という意味であれば0なので不要です。
|
30
|
-
|
31
|
-
```C
|
32
|
-
|
33
|
-
Cp = ((long) 4 * Cp + 4 * N + 1); /*他の象限の扇形+軸の格子点+原点*/
|
34
|
-
|
35
|
-
↓
|
36
|
-
|
37
|
-
Cp = ((long) 4 * Cp + 4 * N); /*他の象限の扇形+軸の格子点+原点*/
|
38
|
-
|
39
|
-
```
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
1000くらいの半径でそれらしい値になります。
|