How can I calculate divide and modulo for integers in C#?

前端 未结 5 1215
醉梦人生
醉梦人生 2020-12-01 11:28

How can I calculate division and modulo for integer numbers in C#?

5条回答
  •  长情又很酷
    2020-12-01 12:26

    Fun fact!

    The 'modulus' operation is defined as:

    a % n ==> a - (a/n) * n
    

    Ref:Modular Arithmetic

    So you could roll your own, although it will be FAR slower than the built in % operator:

    public static int Mod(int a, int n)
    {
        return a - (int)((double)a / n) * n;
    }
    

    Edit: wow, misspoke rather badly here originally, thanks @joren for catching me

    Now here I'm relying on the fact that division + cast-to-int in C# is equivalent to Math.Floor (i.e., it drops the fraction), but a "true" implementation would instead be something like:

    public static int Mod(int a, int n)
    {
        return a - (int)Math.Floor((double)a / n) * n;
    }
    

    In fact, you can see the differences between % and "true modulus" with the following:

    var modTest =
        from a in Enumerable.Range(-3, 6)
        from b in Enumerable.Range(-3, 6)
        where b != 0
        let op = (a % b)
        let mod = Mod(a,b)
        let areSame = op == mod
        select new 
        { 
            A = a,
            B = b,
            Operator = op, 
            Mod = mod, 
            Same = areSame
        };
    Console.WriteLine("A      B     A%B   Mod(A,B)   Equal?");
    Console.WriteLine("-----------------------------------");
    foreach (var result in modTest)
    {
        Console.WriteLine(
            "{0,-3} | {1,-3} | {2,-5} | {3,-10} | {4,-6}", 
            result.A,
            result.B,
            result.Operator, 
            result.Mod, 
            result.Same);
    }
    

    Results:

    A      B     A%B   Mod(A,B)   Equal?
    -----------------------------------
    -3  | -3  | 0     | 0          | True  
    -3  | -2  | -1    | -1         | True  
    -3  | -1  | 0     | 0          | True  
    -3  | 1   | 0     | 0          | True  
    -3  | 2   | -1    | 1          | False 
    -2  | -3  | -2    | -2         | True  
    -2  | -2  | 0     | 0          | True  
    -2  | -1  | 0     | 0          | True  
    -2  | 1   | 0     | 0          | True  
    -2  | 2   | 0     | 0          | True  
    -1  | -3  | -1    | -1         | True  
    -1  | -2  | -1    | -1         | True  
    -1  | -1  | 0     | 0          | True  
    -1  | 1   | 0     | 0          | True  
    -1  | 2   | -1    | 1          | False 
    0   | -3  | 0     | 0          | True  
    0   | -2  | 0     | 0          | True  
    0   | -1  | 0     | 0          | True  
    0   | 1   | 0     | 0          | True  
    0   | 2   | 0     | 0          | True  
    1   | -3  | 1     | -2         | False 
    1   | -2  | 1     | -1         | False 
    1   | -1  | 0     | 0          | True  
    1   | 1   | 0     | 0          | True  
    1   | 2   | 1     | 1          | True  
    2   | -3  | 2     | -1         | False 
    2   | -2  | 0     | 0          | True  
    2   | -1  | 0     | 0          | True  
    2   | 1   | 0     | 0          | True  
    2   | 2   | 0     | 0          | True  
    

提交回复
热议问题