C - 求和并找到最大/最小

时间:2013-08-15 11:06:22

标签: c sum

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

#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 个答案:

答案 0 :(得分:3)

因为smallest从零开始,所以它永远不会改变,因为if (n < smallest)永远不会成立。你需要:

 int smallest = INT_MAX;

或类似的。对于INT_MAX,您需要:

#include <limits.h>

在顶部。

答案 1 :(得分:0)

将scanf移动到while结束,否则您的第一个输入被遗漏;其次,您可以接受负输入并对其进行所有处理。 此外,最小值必须是最大值,否则smallest = 0n < 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而失败。这可以通过多种方式解决。我建议将读取的第一个值设置为largestsmallest。也是循环结束时的第二个scanf("%d", &n); s / b。

你有其他问题,虽然很微妙。

  1. int值&gt;的情况下,将float汇总到int可能会在许多环境中失去精确度大约24,000,000。建议一个大整数类型来汇总你的值,如uint64_t。

  2. 最后“将其除以最大值并乘以最小数量”它是唯一需要浮点数学的地方。你做的数学运算没问题,但更有可能出现舍入误差。

  3. 如果您的第一个n&lt; = 0,您将执行除以0。

  4. 示例修复:

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