質問内容
半径の値(正の整数値)を入力したときに原点を中心とする入力した半径の円の中に含まれる格子点の数を数えて円周率を計算するプログラムを作成したのですが、n = 50000あたりからint型の範囲を超えてしまうのか、全く違う値が出力されてしまいます。どのようにすればこれを防ぐことができるのでしょうか。
ぜひ教えていただければと思います。
発生している問題・エラーメッセージ
自分の入力、出力結果 50000 50000:-2.333878859149978 正解の入力、出力結果 50000 50000:3.141592418000000
該当のソースコード
C
1#include <stdio.h> 2#include <math.h> 3 4double CountPoints(int N){ /*格子点の数を計算し円周率を計算する関数*/ 5 int x; 6 long Cp = 0; /*格子点の数*/ 7 double pi; /*円周率*/ 8 for(x = 1; x < N; x++){ 9 if(N * N - x * x >= 0){ /*円周で囲まれる部分の格子点を全てたす*/ 10 Cp += ((long) sqrt(N * N - x * x)); 11 } 12 } 13 Cp = ((long) 4 * Cp + 4 * N + 1); /*他の象限の扇形+軸の格子点+原点*/ 14 pi = ((double) Cp / (double) (N * N)); /* 面積/半径の二乗 */ 15 return pi; 16} 17 18int main(void){ 19 int n; 20 double Pi; 21 scanf("%d",&n); /*半径を入力*/ 22 Pi = CountPoints(n); /*入力された半径に応じて円周率を計算*/ 23 printf("%d:%.15f\n",n,Pi); /*半径と円周率を出力*/ 24 return 0; 25}
試したこと
for文の二重ループを使わず、各xの値について格子点がいくつ含まれるかを数え上げるようにしました。
補足情報
long型は使用できる環境です。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/05/30 08:46
2020/05/30 09:03