有人可以查看我的代码,并给我一些指示,说明为什么它不能正常工作。只要它们是正整数然后计算它们的总和,将其除以最大值并乘以最小数字,就应该询问数字。
#include <stdio.h>
int main () {
int n, largest=0, smallest=0;
float sum=0;
scanf("%d", &n);
while (n > 0) {
scanf("%d", &n);
if (n > largest) {
largest = n;
}
if (n < smallest) {
smallest = n;
}
sum += n;
}
sum = sum / largest * smallest;
printf("%f\n", sum);
return 0;
}
答案 0 :(得分:3)
因为smallest
从零开始,所以它永远不会改变,因为if (n < smallest)
永远不会成立。你需要:
int smallest = INT_MAX;
或类似的。对于INT_MAX
,您需要:
#include <limits.h>
在顶部。
答案 1 :(得分:0)
将scanf移动到while结束,否则您的第一个输入被遗漏;其次,您可以接受负输入并对其进行所有处理。
此外,最小值必须是最大值,否则smallest = 0
,n < smallest
将不起作用
#include <stdio.h>
int main () {
int n, largest=0, smallest=INT_MAX;
float sum=0;
scanf("%d", &n);
while (n > 0) {
if (n > largest) {
largest = n;
}
if (n < smallest) {
smallest = n;
}
sum += n;
scanf("%d", &n);
}
sum = sum / largest * smallest;
printf("%f\n", sum);
return 0;
}
答案 2 :(得分:0)
将while
循环条件从while (n > 0)
更改为while (scanf("%d", &n) && n > 0)
。在这种情况下,您还可以删除第一个scanf("%d", &n)
和while
循环正文中的{。}}。
问题在于,因为您的scanf("%d", &n)
位于您的while循环的正文中,所以在执行0
时不会检查它是否大于if (n > largest)
和if (n < smallest)
。
此外,您应该将smallest
初始化为最大可能值。在这种情况下是INT_MAX
。
答案 3 :(得分:0)
您的代码主要由于int smallest=0
而失败。这可以通过多种方式解决。我建议将读取的第一个值设置为largest
和smallest
。也是循环结束时的第二个scanf("%d", &n);
s / b。
你有其他问题,虽然很微妙。
在int
值&gt;的情况下,将float
汇总到int
可能会在许多环境中失去精确度大约24,000,000。建议一个大整数类型来汇总你的值,如uint64_t。
最后“将其除以最大值并乘以最小数量”它是唯一需要浮点数学的地方。你做的数学运算没问题,但更有可能出现舍入误差。
如果您的第一个n
&lt; = 0,您将执行除以0。
示例修复:
#include <stdio.h>
int main() {
int n, largest = 1, smallest = 0; // set largest to 1 to deal with first n being < 0 and thus avoiding /0
uint64_t sum = 0;
scanf("%d", &n);
while (n > 0) {
if (sum > 0) {
if (n > largest) {
largest = n;
}
if (n < smallest) {
smallest = n;
}
} else { // This is the first time as sum is 0
largest = smallest = n;
}
sum += n;
scanf("%d", &n);
}
printf("%lf\n", ((double) sum) / smallest * largest);
return 0;
}