回答編集履歴
1
long long としてみた。
test
CHANGED
@@ -9,3 +9,59 @@
|
|
9
9
|
|
10
10
|
|
11
11
|
オーバーフローと言う事に気付いているならば、途中計算の結果にも注意しましょう。
|
12
|
+
|
13
|
+
|
14
|
+
|
15
|
+
--- long long としてみた。[追記]
|
16
|
+
|
17
|
+
```C
|
18
|
+
|
19
|
+
double CountPoints(long long N){ /*格子点の数を計算し円周率を計算する関数*/
|
20
|
+
|
21
|
+
long long x;
|
22
|
+
|
23
|
+
long long Cp = 0; /*格子点の数*/
|
24
|
+
|
25
|
+
double pi; /*円周率*/
|
26
|
+
|
27
|
+
for(x = 1; x < N; x++){
|
28
|
+
|
29
|
+
if(N * N - x * x >= 0){ /*円周で囲まれる部分の格子点を全てたす*/
|
30
|
+
|
31
|
+
Cp += ((long long) sqrt(N * N - x * x));
|
32
|
+
|
33
|
+
}
|
34
|
+
|
35
|
+
}
|
36
|
+
|
37
|
+
Cp = ((long) 4 * Cp + 4 * N + 1); /*他の象限の扇形+軸の格子点+原点*/
|
38
|
+
|
39
|
+
pi = ((double) Cp / (double) (N * N)); /* 面積/半径の二乗 */
|
40
|
+
|
41
|
+
return pi;
|
42
|
+
|
43
|
+
}
|
44
|
+
|
45
|
+
|
46
|
+
|
47
|
+
int main(void){
|
48
|
+
|
49
|
+
int n;
|
50
|
+
|
51
|
+
double Pi;
|
52
|
+
|
53
|
+
scanf("%d",&n); /*半径を入力*/
|
54
|
+
|
55
|
+
Pi = CountPoints(n); /*入力された半径に応じて円周率を計算*/
|
56
|
+
|
57
|
+
printf("%d:%.15f\n",n,Pi); /*半径と円周率を出力*/
|
58
|
+
|
59
|
+
return 0;
|
60
|
+
|
61
|
+
}
|
62
|
+
|
63
|
+
```
|
64
|
+
|
65
|
+
結果:
|
66
|
+
|
67
|
+
300000:3.141592641433333
|