結果

問題 No.508 超ゆとり教育
ユーザー Hattie
提出日時 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
権限があれば一括ダウンロードができます

ソースコード

diff #

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) // 半径を出力
	}
}
0