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

回答編集履歴

1

long long としてみた。

2020/05/30 07:37

投稿

pepperleaf
pepperleaf

スコア6385

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