Язык C # имеет синтаксис, аналогичный Java. Я написал это рекурсивное решение.
static BigInteger fsqrt(BigInteger n)
{
string sn = n.ToString();
return guess(n, BigInteger.Parse(sn.Substring(0, sn.Length >> 1)), 0);
}
static BigInteger guess(BigInteger n, BigInteger g, BigInteger last)
{
if (last >= g - 1 && last <= g + 1) return g;
else return guess(n, (g + (n / g)) >> 1, g);
}
Назовите этот код так (в Java, я думаю, это будет "System.out.print").
Console.WriteLine(fsqrt(BigInteger.Parse("783648276815623658365871365876257862874628734627835648726")));
И ответ таков:
+27993718524262253829858552106
Отказ от ответственности: я понимаю, что этот метод не работает для чисел меньше 10; это метод квадратного корня BigInteger.
Это легко исправить. Измените первый метод на следующий, чтобы дать рекурсивной части немного пространства для дыхания.
static BigInteger fsqrt(BigInteger n)
{
if (n > 999)
{
string sn = n.ToString();
return guess(n, BigInteger.Parse(sn.Substring(0, sn.Length >> 1)), 0);
}
else return guess(n, n >> 1, 0);
}