我怎样才能正确减去?

时间:2018-05-19 15:28:46

标签: c

我尝试减去多个数字,但这段代码不能给我正确的结果,我该如何更改呢?

#include <stdio.h>

int main(void) {
    int nnr, i, nr[100], rez;

    rez = 0;
    printf("\nHow many numbers do you want to subtract?\n");
    scanf("%d", &nnr);

    printf("\nWrite the numbers:\n");
    for(i = 1; i <= nnr; i++) {
        printf("%d: ", i);
        scanf("%d", &nr[i]);
    }

    for(i = 1; i <= nnr; i++) {
        rez += nr[i] - rez;
    }

    printf("\nResult: %d\n", rez);
}

3 个答案:

答案 0 :(得分:3)

您在评论中澄清,当给出三个由2,5和7组成的输入数字时,您希望程序执行计算2 - 5 - 7并打印结果。但是你的代码是错误的。

这是关键部分:

    rez = 0;
     

[..]

    for(i = 1; i <= nnr; i++) {
        rez += nr[i] - rez;
    }

那会给你

  • rez = 0 + 2 - 0(= 2)
  • rez = 2 + 5 - 2(= 5)
  • rez = 5 + 7 - 5(= 7)

事实上,我们可以概括地认识到形式x += y - x的构造大致等同于x = y,但存在算术溢出的风险。

显然,您希望使用rez -= nr[i]形式的表达式(等效地:rez = rez - nr[i]),除了您希望rez = nr[i]的第一个数字。你如何实际实现它是一个练习。

答案 1 :(得分:2)

1)始终以0

开始循环

2)使用&lt; nnr

答案 2 :(得分:1)

真正令人敬畏的是,这样一个微不足道的事情可能会造成很多可能出现错误的案例。

  • 不检查scanf返回类型。检查scanf
  • 的返回值
  • 您还需要检查减法是否会导致溢出。
  • 检查输入的号码是否不会让您访问数组索引超出范围。
  • 我们通常使用来自0索引的loping。惯例以及更易于使用(使您免于跨越数组边界)。

  • 首次迭代时,rez的值将为nr[0],之后您可以减去其他数字。

for(size_t i = 0; i < nnr; i++){
   if(!i) rez = nr[i];
   else
      rez = rez - nr[i];
}

这将为您提供2-5-7 = -10

同样是的,你可以在for循环之外取出if(!i),然后对nnr-1数字减去相应的元素。好处?通过执行此操作来保存nnr-1比较。