回答編集履歴

3

+1の誤りを修正しました。4 * Nがあるのでループを1開始に戻しました。

2020/06/01 03:35

投稿

etsuhisa
etsuhisa

スコア416

test CHANGED
@@ -8,19 +8,19 @@
8
8
 
9
9
  int x;
10
10
 
11
- double Cp = 0; /*格子点の数*/
11
+ long long Cp = 0; /*格子点の数*/
12
12
 
13
13
  double pi; /*円周率*/
14
14
 
15
- for (x = 0; x < N; x++) {
15
+ for (x = 1; x < N; x++) {
16
16
 
17
- Cp += ((long)sqrt((double)N * N - (double)x * x) + 1); //x軸上の格子点分を+1
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を格子点の数になるよう修正しました。

2020/06/01 03:35

投稿

etsuhisa
etsuhisa

スコア416

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での計算に変更しました。

2020/05/30 07:14

投稿

etsuhisa
etsuhisa

スコア416

test CHANGED
@@ -1,43 +1,29 @@
1
- 原点0で計算しま
1
+ xとN整数のままとして、その他をdoubleで計算するようにしました
2
2
 
3
3
 
4
4
 
5
- ループの初期値は0です。これで半径の高さが得られます。
6
-
7
5
  ```C
8
6
 
9
- for(x = 1; x < N; x++){
7
+ double CountPoints(int N) { /*格子点の数を計算し円周率を計算する関数*/
10
8
 
11
-
9
+ int x;
12
10
 
11
+ double Cp = 0; /*格子点の数*/
12
+
13
+ double pi; /*円周率*/
14
+
13
- for(x = 0; x < N; x++){
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くらいの半径でそれらしい値になります。