我尝试减去多个数字,但这段代码不能给我正确的结果,我该如何更改呢?
#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);
}
答案 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
比较。