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

回答編集履歴

3

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

2020/06/01 03:35

投稿

etsuhisa
etsuhisa

スコア416

answer CHANGED
@@ -3,13 +3,13 @@
3
3
  ```C
4
4
  double CountPoints(int N) { /*格子点の数を計算し円周率を計算する関数*/
5
5
  int x;
6
- double Cp = 0; /*格子点の数*/
6
+ long long Cp = 0; /*格子点の数*/
7
7
  double pi; /*円周率*/
8
- for (x = 0; x < N; x++) {
8
+ for (x = 1; x < N; x++) {
9
- Cp += ((long)sqrt((double)N * N - (double)x * x) + 1); //x軸上の格子点分を+1
9
+ Cp += ((long)sqrt((double)N * N - (double)x * x));
10
10
  }
11
- Cp = (4 * Cp + 4 * N); /*他の象限の扇形+軸の格子点+原点*/
11
+ Cp = ((long)4 * Cp + 4 * N + 1); /*他の象限の扇形+軸の格子点+原点*/
12
- pi = (Cp / ((double)N * N)); /* 面積/半径の二乗 */
12
+ pi = ((double)Cp / ((double)N * N)); /* 面積/半径の二乗 */
13
13
  return pi;
14
14
  }
15
15
  ```

2

Cpを格子点の数になるよう修正しました。

2020/06/01 03:35

投稿

etsuhisa
etsuhisa

スコア416

answer CHANGED
@@ -6,7 +6,7 @@
6
6
  double Cp = 0; /*格子点の数*/
7
7
  double pi; /*円周率*/
8
8
  for (x = 0; x < N; x++) {
9
- Cp += (sqrt((double)N * N - (double)x * x));
9
+ Cp += ((long)sqrt((double)N * N - (double)x * x) + 1); //x軸上の格子点分を+1
10
10
  }
11
11
  Cp = (4 * Cp + 4 * N); /*他の象限の扇形+軸の格子点+原点*/
12
12
  pi = (Cp / ((double)N * N)); /* 面積/半径の二乗 */

1

doubleでの計算に変更しました。

2020/05/30 07:14

投稿

etsuhisa
etsuhisa

スコア416

answer CHANGED
@@ -1,22 +1,15 @@
1
- 原点0で計算しま
1
+ xとN整数のままとして、その他をdoubleで計算するようにしました
2
2
 
3
- ループの初期値は0です。これで半径の高さが得られます。
4
3
  ```C
4
+ double CountPoints(int N) { /*格子点の数を計算し円周率を計算する関数*/
5
+ int x;
6
+ double Cp = 0; /*格子点の数*/
5
- for(x = 1; x < N; x++){
7
+ double pi; /*円周率*/
6
-
7
- for(x = 0; x < N; x++){
8
+ for (x = 0; x < N; x++) {
9
+ Cp += (sqrt((double)N * N - (double)x * x));
10
+ }
11
+ Cp = (4 * Cp + 4 * N); /*他の象限の扇形+軸の格子点+原点*/
12
+ pi = (Cp / ((double)N * N)); /* 面積/半径の二乗 */
13
+ return pi;
14
+ }
8
- ```
15
+ ```
9
-
10
- ループの終了条件が「x < N」でこの判定は常に真でなので不要です。
11
- ```C
12
- if(N * N - x * x >= 0){ /*円周で囲まれる部分の格子点を全てたす*/
13
- ```
14
-
15
- 原点となっている1を加算する理由がわからなかったのですが、原点という意味であれば0なので不要です。
16
- ```C
17
- Cp = ((long) 4 * Cp + 4 * N + 1); /*他の象限の扇形+軸の格子点+原点*/
18
-
19
- Cp = ((long) 4 * Cp + 4 * N); /*他の象限の扇形+軸の格子点+原点*/
20
- ```
21
-
22
- 1000くらいの半径でそれらしい値になります。