আপনি যদি নেতিবাচক লভ্যাংশ / বিভাজক হিসাবে বিবেচনা করেন তবে "যদি (এম <0) মি = -m;" যোগ করেন তবেও শ্রীভাতসার এর উত্তর সমস্ত ক্ষেত্রে কার্যকর হবে না।
উদাহরণস্বরূপ, -12 মোড -10 হবে 8, এবং এটি -2 হওয়া উচিত।
নিম্নলিখিত প্রয়োগটি ইতিবাচক এবং নেতিবাচক লভ্যাংশ / বিভাজন উভয়ের জন্য কাজ করবে এবং অন্যান্য বাস্তবায়ন (যথা, জাভা, পাইথন, রুবি, স্কালা, স্কিম, জাভাস্ক্রিপ্ট এবং গুগলের ক্যালকুলেটর) এর সাথে সম্মতি জানায়:
internal static class IntExtensions
{
internal static int Mod(this int a, int n)
{
if (n == 0)
throw new ArgumentOutOfRangeException("n", "(a mod 0) is undefined.");
//puts a in the [-n+1, n-1] range using the remainder operator
int remainder = a%n;
//if the remainder is less than zero, add n to put it in the [0, n-1] range if n is positive
//if the remainder is greater than zero, add n to put it in the [n-1, 0] range if n is negative
if ((n > 0 && remainder < 0) ||
(n < 0 && remainder > 0))
return remainder + n;
return remainder;
}
}
XUnit ব্যবহার করে টেস্ট স্যুট:
[Theory]
[PropertyData("GetTestData")]
public void Mod_ReturnsCorrectModulo(int dividend, int divisor, int expectedMod)
{
Assert.Equal(expectedMod, dividend.Mod(divisor));
}
[Fact]
public void Mod_ThrowsException_IfDivisorIsZero()
{
Assert.Throws<ArgumentOutOfRangeException>(() => 1.Mod(0));
}
public static IEnumerable<object[]> GetTestData
{
get
{
yield return new object[] {1, 1, 0};
yield return new object[] {0, 1, 0};
yield return new object[] {2, 10, 2};
yield return new object[] {12, 10, 2};
yield return new object[] {22, 10, 2};
yield return new object[] {-2, 10, 8};
yield return new object[] {-12, 10, 8};
yield return new object[] {-22, 10, 8};
yield return new object[] { 2, -10, -8 };
yield return new object[] { 12, -10, -8 };
yield return new object[] { 22, -10, -8 };
yield return new object[] { -2, -10, -2 };
yield return new object[] { -12, -10, -2 };
yield return new object[] { -22, -10, -2 };
}
}