【发布时间】:2011-07-19 23:26:03
【问题描述】:
如何在 C# 中计算整数的除法和模数?
【问题讨论】:
标签: c# math operators division modulo
如何在 C# 中计算整数的除法和模数?
【问题讨论】:
标签: c# math operators division modulo
这是来自MSDN documentation的答案。
当你将两个整数相除时,结果总是一个整数。例如,7 / 3 的结果是 2。要确定 7 / 3 的余数,请使用余数运算符 (%)。
int a = 5;
int b = 3;
int div = a / b; //quotient is 1
int mod = a % b; //remainder is 2
【讨论】:
a 和b 到底有什么意义? :D
quotient = Math.DivRem(dividend, divisor, out remainder);
【讨论】:
Math.DivRem 不会一次计算 div 和 mod。它只是一个辅助函数,它的源代码是:public static int DivRem(int a, int b, out int result) { result = a%b; return a/b; }。
div 和rem 指令
% 和 / 运算符。
有趣的事实!
“模数”运算定义为:
a % n ==> a - (a/n) * n
所以你可以自己滚动,虽然它会比内置的 % 运算符慢得多:
public static int Mod(int a, int n)
{
return a - (int)((double)a / n) * n;
}
编辑:哇,原来这里说错了,感谢@joren 抓住我
现在,我依赖于 C# 中的除法 + 强制转换为整数等价于 Math.Floor(即,它会删除分数)这一事实,但“真正”的实现将类似于:
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
【讨论】:
Enumerable.Range(0, 10).Select(x => (double)x / 10.0).Select(x => (int)x).ToList().ForEach(x => Console.WriteLine(x)); - 全为 0
Math.Floor(-10.0 / 3.0) 和 -10 / 3 不是相同的东西。
使用/ 运算符执行除法:
result = a / b;
使用% 运算符完成模除:
result = a % b;
【讨论】:
从用户那里读取两个整数。然后计算/显示余数和商,
// 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();
【讨论】: