質問編集履歴

2

2020/02/17 14:40

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -28,7 +28,7 @@
28
28
 
29
29
 
30
30
 
31
- https://stackoverflow.com/questions/3432412/calculate-square-root-of-a-biginteger-system-numerics-biginteger にあったソース
31
+ [海外のサイト](https://stackoverflow.com/questions/3432412/calculate-square-root-of-a-biginteger-system-numerics-biginteger) にあったソース
32
32
 
33
33
 
34
34
 

1

2020/02/17 14:40

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -2,35 +2,17 @@
2
2
 
3
3
 
4
4
 
5
- ここに質問の内容を詳しく書いてください。
6
-
7
- (例)PHP(CakePHP)で●●なシステムを作っています。
8
-
9
- ■■な機能を実装中に以下エラーメッセージ発生ました。
5
+ biginteger型平方根の切り上げ
10
6
 
11
7
 
12
8
 
13
- ### 発生している問題・エラーメッセージ
9
+ ### 現状
14
10
 
15
11
 
16
12
 
17
- ```
13
+ 多々のサイトを徘徊し方法を探しているが、桁数が大きいとちゃんとした値が返ってこなかったりして困っている。
18
14
 
19
- エラーメッセージ
20
-
21
- ```
22
-
23
-
24
-
25
- ### 該当ソースコード
15
+ ビット演算など、知識不足自分ではわからないことも多い。
26
-
27
-
28
-
29
- ```ここに言語名を入力
30
-
31
- ソースコード
32
-
33
- ```
34
16
 
35
17
 
36
18
 
@@ -38,12 +20,94 @@
38
20
 
39
21
 
40
22
 
41
- ここに問題に対して試したことを記載してください。
23
+ Math.sqrt → 型が違う為不可
42
24
 
43
25
 
44
26
 
45
- ### 補足情報(FW/ツールのバージョンなど)
46
27
 
47
28
 
48
29
 
30
+
31
+ https://stackoverflow.com/questions/3432412/calculate-square-root-of-a-biginteger-system-numerics-biginteger にあったソース
32
+
33
+
34
+
35
+ ```C#
36
+
37
+
38
+
39
+ public static BigInteger Sqrt(this BigInteger n)
40
+
41
+ {
42
+
49
- ここにより詳細な情報を記載してください。
43
+ if (n == 0) return 0;
44
+
45
+ if (n > 0)
46
+
47
+ {
48
+
49
+ int bitLength = Convert.ToInt32(Math.Ceiling(BigInteger.Log(n, 2)));
50
+
51
+ BigInteger root = BigInteger.One << (bitLength / 2);
52
+
53
+
54
+
55
+ while (!isSqrt(n, root))
56
+
57
+ {
58
+
59
+ root += n / root;
60
+
61
+ root /= 2;
62
+
63
+ }
64
+
65
+
66
+
67
+ return root;
68
+
69
+ }
70
+
71
+
72
+
73
+ throw new ArithmeticException("NaN");
74
+
75
+ }
76
+
77
+
78
+
79
+ private static Boolean isSqrt(BigInteger n, BigInteger root)
80
+
81
+ {
82
+
83
+ BigInteger lowerBound = root*root;
84
+
85
+ BigInteger upperBound = (root + 1)*(root + 1);
86
+
87
+
88
+
89
+ return (n >= lowerBound && n < upperBound);
90
+
91
+ }
92
+
93
+
94
+
95
+ ```
96
+
97
+ 帰ってくる値が切り捨てだったため使えなかった
98
+
99
+
100
+
101
+
102
+
103
+
104
+
105
+
106
+
107
+
108
+
109
+ ### 作業場所
110
+
111
+
112
+
113
+ visual studio2019