結果
| 問題 |
No.313 π
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2017-11-19 16:17:07 |
| 言語 | C#(csc) (csc 3.9.0) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 1,726 bytes |
| コンパイル時間 | 3,190 ms |
| コンパイル使用メモリ | 105,088 KB |
| 実行使用メモリ | 66,436 KB |
| 最終ジャッジ日時 | 2024-11-25 22:54:01 |
| 合計ジャッジ時間 | 214,763 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | TLE * 2 |
| other | TLE * 32 |
コンパイルメッセージ
Microsoft (R) Visual C# Compiler version 3.9.0-6.21124.20 (db94f4cc) Copyright (C) Microsoft Corporation. All rights reserved.
ソースコード
using System;
using System.Linq;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Numerics;
namespace No313
{
class Program
{
static void Main(string[] args)
{
var pi = GetPi().ToString();
var piArray = pi.ToCharArray();
foreach (var piNum in piArray)
{
var a = Console.Read();
var b = Convert.ToChar(a);
if (b != piNum)
{
Console.Write(b + " " + piNum);
return;
}
}
}
static BigInteger GetPi()
{
// 桁数
int iSize = Convert.ToInt32("200000");
//各種変数の初期化
BigInteger oOne = new BigInteger(1);
for (int i = 0; i < iSize; i++)
{
oOne = oOne * 10;
}
BigInteger x = oOne;
BigInteger y = oOne >> 1;
BigInteger z = y;
BigInteger sq = 0;
//サラミンブレント法でPIを算出
int iLoop = (int)Math.Log((double)iSize, 2.0) + 1;
for (int i = 1; i < iLoop; i++)
{
BigInteger pb = (x + y) >> 1;
//ニュートン法による平方根の算出
sq = SqrtNewton(x * y, pb);
x = (pb + sq) >> 1;
y = sq;
z = z - ((x - sq) << i);
}
return ((x + sq) * oOne) / z;
}
/// <summary>
/// ニュートン法による平方根の算出
/// </summary>
/// <param name="x">入力値</param>
/// <param name="x0">初期値</param>
/// <returns>平方根(X)</returns>
/// <remarks>X0として近似値を与えると高速で算出できる</remarks>
static BigInteger SqrtNewton(BigInteger x, BigInteger x0)
{
BigInteger xnn = x0; //X(n+1)
BigInteger xn = new BigInteger(0); //X(n)
while (xnn != xn)
{
xn = xnn;
xnn = (xnn + x / xnn) >> 1;
}
return xnn;
}
}
}