【问题标题】:Division and Mod with negative numbers带负数的除法和 Mod
【发布时间】:2023-03-18 04:43:02
【问题描述】:

我正在尝试解决一个应该很简单的contest problem

2 个数 ab 的商 q 和余数 r 的结果是什么(- 1.000 ≤ a, b

输入由 ab 2 个数字组成。

3 种不同输入的示例:
7 3
7 -3
-7 3

输出是商 q 加上 a 除以 b 的余数 r

输出示例:
2 1
-2 1
-3 2

我的代码:

#include<stdio.h>
int main(){
    int a,b;
    scanf("%d %d",&a,&b);

    int r = 0;
    if(a > 0)
        r = a%b;
    if(a < 0)
        r = (a%b + b)%b;


    printf("%d %d\n",(a-r)/b,r);
}

我的解决方案在 10% 的测试用例中是错误的,我不知道哪里出了问题。

【问题讨论】:

    标签: c++ math


    【解决方案1】:

    您的代码的问题在于,当 b 为负数时,它不符合规范。

    a%b 在 C++ 的某些实现中与 a%(-b) 相同。 (感谢 DarioOO 澄清这一点。请参阅 DarioOO 的评论。)假设这里是这种情况。你的代码

    if(a < 0)
        r = (a%b + b)%b;
    

    假设 b 是正数。如果 b=-3 且 a=-7,则 a%b 为 -1,您的代码指定 r=(-4)%(-3) 为 -1。你应该产生一个非负余数,2。如果 b

    if(a < 0)
        r = (a%b - b)%b;
    

    改为。

    【讨论】:

    • 要清楚,当负数仅在 C++11 中涉及时指定符号,在 C++ 中a%b 可能会产生正数或负数,如果其中一个或两个操作数是否定(a%ba%(-b) 不同,它取决于实现,除非您启用 c++11 或实现自己的模数函数)。
    猜你喜欢
    • 1970-01-01
    • 2020-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-30
    • 1970-01-01
    • 2011-07-20
    • 2010-11-02
    相关资源
    最近更新 更多