Skip to content

Commit 363d730

Browse files
shargonajara87
andauthored
Ceiling Divide BigInteger extension (#4208)
* Ceiling Divide BigInteger extension * Update tests/Neo.Extensions.Tests/UT_BigIntegerExtensions.cs Co-authored-by: Alvaro <[email protected]> * Update src/Neo.Extensions/BigIntegerExtensions.cs Co-authored-by: Alvaro <[email protected]> * Fix: remove whitespace --------- Co-authored-by: Alvaro <[email protected]>
1 parent 0938348 commit 363d730

File tree

2 files changed

+73
-0
lines changed

2 files changed

+73
-0
lines changed

src/Neo.Extensions/BigIntegerExtensions.cs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,28 @@ namespace Neo.Extensions
1818
{
1919
public static class BigIntegerExtensions
2020
{
21+
/// <summary>
22+
/// Performs integer division with ceiling (rounding up).
23+
/// Example: 10 / 3 = 4 instead of 3.
24+
/// </summary>
25+
/// <param name="a">The dividend.</param>
26+
/// <param name="b">The divisor (must be greater than zero).</param>
27+
/// <returns>The result of division rounded up.</returns>
28+
/// <exception cref="ArgumentException">Thrown when divisor is zero or negative.</exception>
29+
public static BigInteger CeilingDivide(this BigInteger a, BigInteger b)
30+
{
31+
if (b <= 0)
32+
throw new ArgumentException("Divider must be greater than zero.", nameof(b));
33+
34+
var divPart = a / b;
35+
var remainder = a % b;
36+
37+
if (remainder == 0)
38+
return divPart;
39+
40+
return a > 0 ? divPart + 1 : divPart;
41+
}
42+
2143
internal static int TrailingZeroCount(byte[] b)
2244
{
2345
var w = 0;

tests/Neo.Extensions.Tests/UT_BigIntegerExtensions.cs

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,57 @@ namespace Neo.Extensions.Tests
2121
[TestClass]
2222
public class UT_BigIntegerExtensions
2323
{
24+
[TestMethod]
25+
public void CeilingDivide_NegativeNumerator()
26+
{
27+
var numerator = new BigInteger(-7);
28+
var denominator = new BigInteger(3);
29+
var result = BigIntegerExtensions.CeilingDivide(numerator, denominator);
30+
Assert.AreEqual(-2, result);
31+
}
32+
[TestMethod]
33+
public void CeilingDivide_DividesExactly()
34+
{
35+
var result = BigIntegerExtensions.CeilingDivide(9, 3);
36+
Assert.AreEqual(3, result);
37+
}
38+
39+
[TestMethod]
40+
public void CeilingDivide_RoundsUp()
41+
{
42+
var result = BigIntegerExtensions.CeilingDivide(10, 3);
43+
Assert.AreEqual(4, result);
44+
}
45+
46+
[TestMethod]
47+
public void CeilingDivide_LargeNumbers()
48+
{
49+
var a = BigInteger.Parse("1000000000000000000000000000000000");
50+
var b = new BigInteger(7);
51+
var result = BigIntegerExtensions.CeilingDivide(a, b);
52+
53+
Assert.AreEqual((a + b - 1) / b, result);
54+
}
55+
56+
[TestMethod]
57+
public void CeilingDivide_DivisorOne()
58+
{
59+
var result = BigIntegerExtensions.CeilingDivide(12345, 1);
60+
Assert.AreEqual(12345, result);
61+
}
62+
63+
[TestMethod]
64+
public void CeilingDivide_ThrowsOnZeroDivisor()
65+
{
66+
Assert.Throws<ArgumentException>(() => BigIntegerExtensions.CeilingDivide(10, 0));
67+
}
68+
69+
[TestMethod]
70+
public void CeilingDivide_ThrowsOnNegativeDivisor()
71+
{
72+
Assert.Throws<ArgumentException>(() => BigIntegerExtensions.CeilingDivide(10, -5));
73+
}
74+
2475
[TestMethod]
2576
public void TestGetLowestSetBit()
2677
{

0 commit comments

Comments
 (0)