在C#中如何计算整数的除法和取模?
a
和b
的目的是什么呢? :D - leviathanbadger还有Math.DivRem
函数。
quotient = Math.DivRem(dividend, divisor, out remainder);
Math.DivRem
函数并不会一次性计算除法和取模运算。它只是一个辅助函数,其源代码如下:public static int DivRem(int a, int b, out int result) { result = a%b; return a/b; }
。 - NightElfikdiv
和 rem
指令更容易。 - kbolino%
和/
运算符的情况。 - Bob趣闻!
'模除'运算被定义为:
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。 - JerKimballMath.Floor(-10.0 / 3.0)
和 -10 / 3
不是同一件事情。 - Joren使用/
运算符进行除法:
result = a / b;
使用%
运算符进行模除:
result = a % b;
余数:a % b 例子:5 % 3 = 2
除法:
当两个变量都是整数时:5/3 = 1
当需要整数结果而输入为小数时:Math.Floor(5/3)
如果不想使用Math类:5/3 - (5%3)/3
// 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();
%
运算符不是模运算符。 - RBT