package main import ( "fmt" ) func main() { var n int // 面積n var radius int // 半径 fmt.Print("円の面積(正の自然数)を入力してください: ") _, err := fmt.Scan(&n) // 面積nを標準入力から読み込む if err != nil { fmt.Println("入力エラー:", err) return } if n <= 0 { fmt.Println("面積は正の自然数で入力してください。") return } // 半径rの円の面積は r * r * 円周率 となる // ここでは円周率を3とします // 面積 n = r * r * 3 // よって r * r = n / 3 // 誤差1000000まで許容されるという条件と、正の自然数で答えるという制約から // 近似的な方法で半径を求めます。 // ここでは、半径を1から順に増やしながら、その半径での面積がnに最も近くなるものを探します。 minDiff := 1000000 + 1 // 許容誤差より大きい初期値 // 半径を1から順に試していく // nが非常に大きい場合を考慮し、nの平方根の約2倍くらいまで試す(n / 3 の平方根が半径の目安) // 例: n=1000000の場合、半径の2乗は約333333。半径は約577。 // 大体の目安として、nまでループすれば十分カバーできるが、効率を考慮して上限を調整 for rCandidate := 1; rCandidate <= n+1; rCandidate++ { // 現在の半径候補での面積を計算 currentArea := rCandidate * rCandidate * 3 // 現在の面積と目標の面積nとの差の絶対値を計算 diff := currentArea - n if diff < 0 { diff = -diff // 絶対値を取る } // 誤差が許容範囲内であれば、その半径を採用し、最も近いものを探す if diff <= 1000000 { if diff < minDiff { minDiff = diff radius = rCandidate } } else if currentArea > n && diff > minDiff { // 現在の面積が目標の面積nを超え、かつ誤差がこれまでの最小誤差よりも大きくなった場合 // これ以上大きな半径を試しても誤差は開く一方なので、ループを終了する break } } // 半径が見つからない場合はエラーメッセージ if radius == 0 && n > 0 { fmt.Println("指定された誤差内で半径を見つけることができませんでした。") fmt.Println("より大きな面積を入力するか、誤差の許容範囲を広げてください。") } else { fmt.Println(radius) // 半径を出力 } }