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

whileループ条件を からwhile (n > 0)に変更しますwhile (scanf("%d", &n) && n > 0)。この場合、ループの最初scanf("%d", &n)と本体にあるものを削除することもできます。while

あなたの問題は、 while ループscanf("%d", &n)本体にあるため、 and0を実行するときにより大きいかどうかがチェックされないことです。if (n > largest)if (n < smallest)

またsmallest、可能な最大値に初期化する必要があります。この場合はINT_MAX.

于 2013-08-15T11:13:57.500 に答える
0

あなたのコードは主にint smallest=0. これは、いくつかの方法で解決できます。最初に読み取った値をlargestとに設定することをお勧めしますsmallest。またscanf("%d", &n);、ループの最後にある 2 番目の s/b。

微妙ではありますが、追加の問題があります。

  1. 値が約 24,000,000 を超えると、多くの環境で精度が低下intする可能性があります。uint64_t のように値を合計する大きな整数型を提案します。floatint

  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 に答える