什么是%
在计算?我似乎无法弄清楚它的作用.
例如,它是否计算出计算的百分比:4 % 2
显然等于0.如何?
例如,
int result;
result = 125/100;
Run Code Online (Sandbox Code Playgroud)
要么
result = 43/100;
Run Code Online (Sandbox Code Playgroud)
结果总会成为师的底线吗?什么是定义的行为?
在ac程序中我正在尝试以下操作(只是检查行为)
x = 5 % (-3);
y = (-5) % (3);
z = (-5) % (-3);
printf("%d ,%d ,%d", x, y, z);
Run Code Online (Sandbox Code Playgroud)
给我输出为(2, -2 , -2)
gcc.我每次都期待一个积极的结果.模数可以为负数吗?任何人都可以解释这种行为吗?
当我计算int i = -1 % 2
我得到-1
Java.在Python中,我得到1
了结果-1 % 2
.使用模数函数在Java中获得相同的行为我需要做什么?
我知道Python//
向负无穷大舍入,而在C++中则/
是截断,向0舍入。
到目前为止,这是我所知道的:
|remainder|
-12 / 10 = -1, - 2 // C++
-12 // 10 = -2, + 8 # Python
12 / -10 = -1, 2 // C++
12 // -10 = -2, - 8 # Python
12 / 10 = 1, 2 // Both
12 // 10 = 1, 2
-12 / -10 = 1, - 2 // Both
= 2, + 8
C++:
1. m%(-n) == m%n
2. -m%n == -(m%n)
3. (m/n)*n …
Run Code Online (Sandbox Code Playgroud) 我最近遇到了一个问题,可以使用模数除法轻松解决,但输入是一个浮点数:
给定周期函数(例如
sin
)和只能在周期范围内计算它的计算机函数(例如[-π,π]),创建一个可以处理任何输入的函数.
"明显"的解决方案是这样的:
#include <cmath>
float sin(float x){
return limited_sin((x + M_PI) % (2 *M_PI) - M_PI);
}
Run Code Online (Sandbox Code Playgroud)
为什么这不起作用?我收到此错误:
error: invalid operands of types double and double to binary operator %
Run Code Online (Sandbox Code Playgroud)
有趣的是,它确实在Python中有效:
def sin(x):
return limited_sin((x + math.pi) % (2 * math.pi) - math.pi)
Run Code Online (Sandbox Code Playgroud) 通常在我的内部循环中,我需要以"环绕"方式索引数组,因此如果数组大小为100并且我的代码要求元素-2,则应该给出元素98.在许多高级语言中作为Python,人们可以简单地使用my_array[index % array_size]
,但由于某种原因,C的整数运算(通常)向零舍入而不是一致向下舍入,因此当给定负的第一个参数时,其模运算符返回负结果.
通常我知道这index
不会少于-array_size
,在这些情况下我只是这样做my_array[(index + array_size) % array_size]
.但是,有时这无法得到保证,对于那些情况,我想知道实现始终为正模数函数的最快方法.有几种"聪明"的方法可以在没有分支的情况下完成,例如
inline int positive_modulo(int i, int n) {
return (n + (i % n)) % n;
}
Run Code Online (Sandbox Code Playgroud)
要么
inline int positive_modulo(int i, int n) {
return (i % n) + (n * (i < 0));
}
Run Code Online (Sandbox Code Playgroud)
当然,我可以对这些进行分析,以找出哪个是我系统中最快的,但我不禁担心我可能错过了一个更好的,或者我的机器上的速度可能在另一个机器上很慢.
那么有没有一种标准的方法可以做到这一点,或者一些我错过的聪明技巧可能是最快的方式?
此外,我知道这可能是一厢情愿的想法,但如果有一种方法可以自动矢量化,那将是惊人的.
在Rust中(与大多数编程语言一样),%
运算符执行余数运算,而不是模运算.这些操作对负数有不同的结果:
-21 modulus 4 => 3
-21 remainder 4 => -1
Run Code Online (Sandbox Code Playgroud)
println!("{}", -21 % 4); // -1
Run Code Online (Sandbox Code Playgroud)
但是,我想要模数.
我找到了一个解决方法((a % b) + b) % b
,但如果已有功能,我不想重新发明轮子!
找出两个数字的除法是否会返回余数的最佳方法是哪一种?我们举个例子,我有一个值为{3,5,7,8,9,17,19}的数组.现在我需要从上面的数组中找到51的完美除数.有没有更简单的方法来解决这个问题?