回答編集履歴
1
long long としてみた。
answer
CHANGED
@@ -3,4 +3,32 @@
|
|
3
3
|
C言語なので環境依存かと思いますが、手元の環境では、もう少し手前で N*N が 32bitを越えます。(正確には、符号付きなので、31bit)
|
4
4
|
Visual Studio 2019の CLコンパイラでは、`long long` とすることでは、もう少し広い範囲まで計算できるようです。(64bit)
|
5
5
|
|
6
|
-
オーバーフローと言う事に気付いているならば、途中計算の結果にも注意しましょう。
|
6
|
+
オーバーフローと言う事に気付いているならば、途中計算の結果にも注意しましょう。
|
7
|
+
|
8
|
+
--- long long としてみた。[追記]
|
9
|
+
```C
|
10
|
+
double CountPoints(long long N){ /*格子点の数を計算し円周率を計算する関数*/
|
11
|
+
long long x;
|
12
|
+
long long Cp = 0; /*格子点の数*/
|
13
|
+
double pi; /*円周率*/
|
14
|
+
for(x = 1; x < N; x++){
|
15
|
+
if(N * N - x * x >= 0){ /*円周で囲まれる部分の格子点を全てたす*/
|
16
|
+
Cp += ((long long) sqrt(N * N - x * x));
|
17
|
+
}
|
18
|
+
}
|
19
|
+
Cp = ((long) 4 * Cp + 4 * N + 1); /*他の象限の扇形+軸の格子点+原点*/
|
20
|
+
pi = ((double) Cp / (double) (N * N)); /* 面積/半径の二乗 */
|
21
|
+
return pi;
|
22
|
+
}
|
23
|
+
|
24
|
+
int main(void){
|
25
|
+
int n;
|
26
|
+
double Pi;
|
27
|
+
scanf("%d",&n); /*半径を入力*/
|
28
|
+
Pi = CountPoints(n); /*入力された半径に応じて円周率を計算*/
|
29
|
+
printf("%d:%.15f\n",n,Pi); /*半径と円周率を出力*/
|
30
|
+
return 0;
|
31
|
+
}
|
32
|
+
```
|
33
|
+
結果:
|
34
|
+
300000:3.141592641433333
|