C中%运算符问题

时间:2013-08-28 14:34:04

标签: c math percentage

我遇到了C中%运算符的问题。我知道%运算符给出了除法的余数。但是,当遇到像1 % 23 % 2这样的问题时,我会感到困惑。谷歌搜索后,我找到了不同的解决方案。

有人说,当1 / 20.5时,我们将其舍入为0.所以1 % 2为0。

其他人说,当1 / 20.5时,我们会像在数学中一样将它四舍五入为1.所以1 % 2为1。

因此,我现在很困惑。我的问题是:什么是1%2?

提前谢谢:):))

5 个答案:

答案 0 :(得分:4)

%是余数运算符:

  

%运算符在除去第一个操作数后计算余数   第二次

这是该师留下的。例如:

5%3是2.
5%4是1.
5%2是1.(因为2可以在5中适合2次,1将被留下)

当你做1%2时,结果是1,因为1/2是0,余数是.. 1。

答案 1 :(得分:3)

简单地说,两者都是错误的方法。如你所说%找到除法的剩余部分。

因此1/2等于0余数1。

答案是1。

另外,为了体验自己,你可以使用这个程序:

#include <stdio.h>

main()
{
    int remainder;

    remainder = 1 % 2;
    printf("1 %% 2 is %d", remainder);
    return(0);
}

希望这会有所帮助:)

答案 2 :(得分:2)

想到M%D的简单方法(如果M和D都是正数)是:

While ( M >= D){
    M = M-D;
}
return M;

答案 3 :(得分:1)

没有舍入,小数部分只是被截断。

因此, 1/2 为0而 1%2 为1。

答案 4 :(得分:0)

这里你需要对余数进行数学定义。

给定两个整数 m,d ,我们说 r m 余数 >和 d 如果 r 满足两个条件:

  • 存在另一个整数 k m == k * d + r
  • 0 <= r < d

在C中我们只有m % d == rm / d == k,只需遵循上面的定义即可 正如你所看到的,根本就没有结合(我的意思是:“截断”是定义的结果)。

从定义中可以得出3%2 == 1和3/2 == 1 其他例子:

  

4/3 == 1和5/3 == 1,尽管5.0 / 3.0 == 1.6666(其中   会圆到2.0)。

     

4%3 == 1和5%3 == 2.

你也可以信任公式r = m - k * d,它在C中写成:

m % d == m - (m / d) * d

但是,在标准C中,整数除法遵循以下规则:round to 0 因此,对于负操作数,C提供的数学结果与数学结果不同 我们会:

  

( - 4)/ 3 == -1,( - 4)%3 == -1(在C中),但在简单的数学中:( - 4)/ 3 = -2,( - 4)%3 = 2。

在简单的数学中,余数总是非负的,并且小于abs(d) 在标准C中,余数始终具有第一个运算符的符号。

备注:此描述(在否定的情况下)仅适用于标准C99 / C11。您必须小心编译器版本,并进行一些测试。