C# 如何计算C中整数的除法和模?
如何计算C中整数的除法和模?下面是一个答案 当你除以两个整数时,结果总是一个整数。例如,7/3的结果是2。要确定7/3的余数,请使用余数运算符 使用/运算符执行除法: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
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();