C# 如何计算C中整数的除法和模?

C# 如何计算C中整数的除法和模?,c#,math,operators,division,modulo,C#,Math,Operators,Division,Modulo,如何计算C中整数的除法和模?下面是一个答案 当你除以两个整数时,结果总是一个整数。例如,7/3的结果是2。要确定7/3的余数,请使用余数运算符 使用/运算符执行除法: public static int Mod(int a, int n) { return a - (int)((double)a / n) * n; } 使用%运算符进行模除: public static int Mod(int a, int n) { return a - (int)((double)a / n

如何计算C中整数的除法和模?

下面是一个答案

当你除以两个整数时,结果总是一个整数。例如,7/3的结果是2。要确定7/3的余数,请使用余数运算符

使用/运算符执行除法:

public static int Mod(int a, int n)
{
    return a - (int)((double)a / n) * n;
}
使用%运算符进行模除:

public static int Mod(int a, int n)
{
    return a - (int)((double)a / n) * n;
}
有趣的事实

“模数”运算定义为:

a % n ==> a - (a/n) * n
参考:

因此,您可以自己滚动,尽管速度远低于内置的%operator:

public static int Mod(int a, int n)
{
    return a - (int)((double)a / n) * n;
}
编辑:哇,原来这里说错得很厉害,谢谢@joren抓住我


现在,我依靠的是C中除法+转换为int等于数学,也就是说,它去掉了分数,但真正的实现是这样的:

public static int Mod(int a, int n)
{
    return a - (int)Math.Floor((double)a / n) * n;
}
事实上,您可以通过以下方式看到%和真实模量之间的差异:

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);
}
结果:

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  
还有


从用户处读取两个整数。然后计算/显示余数和商

// When the larger integer is divided by the smaller integer
Console.WriteLine("Enter integer 1 please :");
double a5 = double.Parse(Console.ReadLine());
Console.WriteLine("Enter integer 2 please :");
double b5 = double.Parse(Console.ReadLine());

double div = a5 / b5;
Console.WriteLine(div);

double mod = a5 % b5;
Console.WriteLine(mod);

Console.ReadLine();

+1:方便地省去类型会使它成为一个更好的答案:-我相信这也适用于4.0中的System.Numeric.BigInteger。%->正如Cor_Blimey所说,它返回的是余数而不是模。例如:-5%3==-2[C],-5 mod 3=1[wolframalpha.com]。注意:模与模不同。模是余数,模是绝对值。这可能太基本了,但这是一个真正的问题……关于为什么%运算符不是C中的模运算符,一个相关且必须阅读的问题。%返回余数,而不是您指出的模。它们不是一回事,在处理异常情况(例如负指数)时可能会导致问题。然而,它可以像模运算符一样使用,例如,每10次迭代一次弱正索引器。也许你可以解释一下如何计算实际模量?没错,我读过这样的帖子,我的应用程序中遇到了问题:…如果你不打算使用它们,那么声明a和b到底有什么意义DPerhaps用户像我一样在搜索DivRem函数,所以这个问题可能不像乍看起来那么简单。谢谢@Danodonovan答案并不像其他人指出的那样简单,可能会导致难以调试的错误。看,现在我依靠的是一个事实,C中的整数除法相当于数学,也就是说,它去掉了分数,但事实并非如此。整数除数向零舍入,数学。下限向负无穷舍入。@Joren抱歉,但没有-尝试运行以下命令:Enumerable.Range0,10.Selectx=>doublex/10.0.Selectx=>intx.ToList.ForEachx=>Console.WriteLinex;-首先,我说的是整数除法。如果进行浮点除法,然后将其转换为整数,则会发生什么情况并不重要,即使它会给出相同的结果。第二,我不知道为什么你会期望0到9之间的整数在除以10并截断为整数部分后,得到除0以外的任何结果。若结果是1,那个么它将从零开始四舍五入,或者朝向正无穷大。第三,正数向零舍入和向负无穷舍入之间没有任何区别,所以你甚至没有解决这个问题。数学。Floor-10.0/3.0和-10/3不是一回事。@joren啊,我看到了这里的脱节-不,我没有执行整数除法,我在执行双除法,然后将结果转换为整数-非常不同。我认为这应该是正确的答案,因为它在一个函数中提供商和余数。我不确定哪种方法使用a/b来获得商,然后使用a%b来获得余数或Math.DivRem,效果更好,但在我的案例中,这种方法显然更适合阅读,我需要同时了解商和余数-谢谢@Igor谢谢,当原始问题得到回答时,此功能不存在!然而,函数的存在确实使cii关于检查文档的评论看起来有点愚蠢为了避免混淆,Math.DivRem不会在一次操作中计算div和mod。它只是一个帮助函数,它的源代码是:public static int DivRemint a,int b,out int result{result=a%b;return a/b;}。@NightElfik该实现将来可能会更改,运行时识别优化方法调用比不相交的div和rem更容易instructions@kbolino这是一个很好的预测,因为,至少在.NETCore中,除法和减法是可行的。RyuJIT中还计划进一步优化,以使用单个x86 div指令,尽管不可否认,如果单独使用,JIT更改还应检测%和/运算符。
quotient = Math.DivRem(dividend, divisor, out remainder);
// When the larger integer is divided by the smaller integer
Console.WriteLine("Enter integer 1 please :");
double a5 = double.Parse(Console.ReadLine());
Console.WriteLine("Enter integer 2 please :");
double b5 = double.Parse(Console.ReadLine());

double div = a5 / b5;
Console.WriteLine(div);

double mod = a5 % b5;
Console.WriteLine(mod);

Console.ReadLine();