結果
| 問題 |
No.508 超ゆとり教育
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2025-07-17 12:28:48 |
| 言語 | Go (1.23.4) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,489 bytes |
| コンパイル時間 | 12,609 ms |
| コンパイル使用メモリ | 246,660 KB |
| 実行使用メモリ | 7,720 KB |
| 最終ジャッジ日時 | 2025-07-17 12:29:02 |
| 合計ジャッジ時間 | 11,841 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | WA * 1 |
| other | WA * 7 |
ソースコード
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) // 半径を出力
}
}