0

有人可以看看我的代码并给我一些指示为什么它不能正常工作。它应该询问数字,只要它们是正整数,然后计算它们的总和,将其除以最大数并乘以最小数。

#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;
}
4

4 回答 4

3

因为smallest从零开始,它永远不会改变,因为if (n < smallest)永远不会是真的。你需要:

 int smallest = INT_MAX;

或类似的。因为INT_MAX你需要:

#include <limits.h>

在顶部。

于 2013-08-15T11:08:16.250 回答
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;
}
于 2013-08-15T11:08:53.190 回答
0

您的代码失败主要是由于int smallest=0. 这可以通过多种方式解决。我建议将读取的第一个值设置为largestand smallestscanf("%d", &n);也是循环结束时的第二个s/b。

您还有其他问题,尽管很微妙。

  1. 当值 > 约 24,000,000时,在许多环境中求和可能intfloat丢失精度。int建议使用大整数类型来汇总您的值,例如 uint64_t。

  2. 最后的“除以最大数并乘以最小数”它是唯一需要浮点数学的地方。您所做的数学运算还可以,但更容易出现舍入错误。

  3. 如果您的第一个n<= 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;
}
于 2013-08-15T17:28:38.463 回答
0

while将循环条件从更改while (n > 0)while (scanf("%d", &n) && n > 0)。在这种情况下,您还可以删除循环scanf("%d", &n)主体中的第一个和第一个。while

您的问题是,因为您scanf("%d", &n)在 while 循环的主体0中,所以在执行if (n > largest)and时不会检查它是否更大if (n < smallest)

此外,您应该将您的初始化smallest为最大可能值。在这种情况下INT_MAX

于 2013-08-15T11:13:57.500 回答