如何在不使用模运算符的情况下找到除以两个数的余数!! 我的老师给了我这个精确的练习,这只是我在第五讲的编程基础课程 我已经尝试过这个等式,
a%b = a - (a/b)*b
但它总是返回零!
答案 0 :(得分:5)
我刚试过这个
public static void main (String [] args){
int a = 50;
int b = 9;
int c = a%b;
int d = a - (a/b)*b;
System.out.println(c);
System.out.println(d);
}
它似乎有效。你的变量是什么类型的?
答案 1 :(得分:3)
好吧,你可以做模数运算符通常在内部执行的操作。
在循环内部,反复从b
减去a
。当这不再可能时,您留下的号码就是您的答案。
这是一个代码示例。 如果您尝试为十进制数完成此操作,请注意浮点值的舍入错误。
double result = a;
while(result - b >= 0) {
result -= b;
}
return result;
请注意,如果您正在使用整数,并且允许使用除法运算符,则不需要使用循环。
但是,请记住,所有除法都是重复减法。如果这是出于教学目的,我认为以我的方式做到这一点会更酷。
答案 2 :(得分:2)
在%
或double
数字上执行float
是没有意义的,因为浮点数实际上每个都代表一个非常小范围的值,而不是精确值。通常,浮点数的内部表示与该范围内的数字不是您用于创建数字的实际小数。这意味着对于浮点类型,%
的结果是正式未定义的。
如果你在Java中尝试0.3 % 0.1
,你实际上会得到0.09999999999999998
,这看起来似乎是不正确的;但考虑到浮点数真正代表什么,这与任何其他结果一样有意义。
以下是制定%
的最简单的解决方案,而不是实际使用%
。
a - b * (long)(a/b);
它会比重复减法的答案表现更好,因为它不必反复循环。
但是这个解决方案不可避免地成为与本页某些其他答案相同的陷阱的受害者,即“正确”的答案正式未定义。
如果您的数字非常大,此解决方案也会出现溢出问题。
答案 3 :(得分:1)
您需要使用a / b的Math.floor。
你有一个%b = a - (a / b)* b 但实际上是%b = a-(Math.floor(a / b)* b)
这是因为没有math.floor它包含小数余数和(a / b)* b等于a所以当你从a中减去它时,你每次都会得到0,就像你经历过的那样。
答案 4 :(得分:0)
使用double
时,该等式将始终返回0
。当使用int
时,由于截断(整数除法),该等式必须起作用。
这是计算除法中余数的算法。假设您要查找a % b
:
while dividend is larger or equal than divisor
substract divisor from dividend
print last result
在Java中实现它看起来像:
public static void main(String[] args)
{
double a = 5, b = 2;
while (a >= b) {
a -= b;
}
System.out.println(a);
}