【问题标题】:Difficulty with mod operator [duplicate]mod运算符的困难[重复]
【发布时间】:2021-03-31 05:36:02
【问题描述】:

如果有人能帮助我解决这个问题,我将不胜感激。

C 程序包含以下声明和初始赋值。

int i = 8,  j = 5;
float x = 0.005, y = - 0.01;
char c = 'c',  d = 'd';

使用分配给表达式变量的值确定以下表达式的值:

(i - 3 * j) % ( c + 2 *d)/ (x - y )

我先手动尝试了这个:

( i- 3 * j) % ( c + 2 *d ) / ( x - y)
( 8 - 3*5) % ( 99 + 2 * 100 ) / ( 0.005 - (-0.01) )
( -7 ) % ( 299 ) / (  0.015 )

牢记优先级和关联性,我首先使用了 mod 运算符:

( 292 ) / (  0.015 )

答案是 19466.66。

这与书中给出的答案不匹配,或者当我在代码块中使用它时,两者都给出了答案 - 466.6667

codeblocks程序如下

#include <stdio.h> 
#include <stdlib.h> 
 
int main() 
{ 
    int i = 8,j = 5, c = 'c',d = 'd'; 
    float x = 0.005, y = -0.01, a = 0.0; // a is the float variable to which the value is assigned
    a = (i-3*j)%(c+2*d)/(x-y); 
    printf("%f\n",a); 
    return 0; 
}

【问题讨论】:

  • 尽量不要在代码中使用行号。如果我们想运行并测试它,我们只需要删除它,很繁琐。
  • 这是一个使用书中给出的运算符和ASCII值的练习。感谢您的编辑。
  • 你有一个算术错误:0.005 - 0.01 == -0.005,而不是-0.015
  • 您的代码也有y = -0.01,但问题有y = 0.01;它应该是什么?最后(-7) % 299 不是292 而是-7
  • 在代码中 y = -0.01 不是正数 0.01

标签: c operator-keyword modulo


【解决方案1】:

关键是除法前的整数部分:

(i-3*j)%(c+2*d)

计算结果为:

(8-3*5) % (99 + 2 * 100)
(8-15) % (99 + 200)
-7 % 299

所以现在这取决于 C 使用的 modulo 的定义,因为它可能有几个。 C 将其解释为 -7,而其他语言始终映射到 0 到 298 范围。

剩下的只是简单的除法。

【讨论】:

    【解决方案2】:

    您必须在计算的最后(并且一次)使用除法来保持精度。

    使用除法,您可能会失去精度。查看蝴蝶效应 Wikipedia 页面为什么它可以产生巨大差异。

    您可以使用分数,并且仅在打印时进行除法。

    【讨论】:

    • 如果这是蝴蝶效应,那么涉及的蝴蝶就是Mothra
    猜你喜欢
    • 1970-01-01
    • 2016-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-28
    • 1970-01-01
    • 1970-01-01
    • 2019-03-30
    相关资源
    最近更新 更多