前提・実現したいこと
biginteger型の平方根の切り上げが欲しい
現状
多々のサイトを徘徊し方法を探しているが、桁数が大きいとちゃんとした値が返ってこなかったりして困っている。
ビット演算など、知識不足の自分ではわからないことも多い。
試したこと
Math.sqrt → 型が違う為不可
海外のサイト にあったソース
C#
1 2 public static BigInteger Sqrt(this BigInteger n) 3 { 4 if (n == 0) return 0; 5 if (n > 0) 6 { 7 int bitLength = Convert.ToInt32(Math.Ceiling(BigInteger.Log(n, 2))); 8 BigInteger root = BigInteger.One << (bitLength / 2); 9 10 while (!isSqrt(n, root)) 11 { 12 root += n / root; 13 root /= 2; 14 } 15 16 return root; 17 } 18 19 throw new ArithmeticException("NaN"); 20 } 21 22 private static Boolean isSqrt(BigInteger n, BigInteger root) 23 { 24 BigInteger lowerBound = root*root; 25 BigInteger upperBound = (root + 1)*(root + 1); 26 27 return (n >= lowerBound && n < upperBound); 28 } 29
帰ってくる値が切り捨てだったため使えなかった
作業場所
visual studio2019
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2020/02/18 01:07