我正在解決這個問題,我需要提供一些輸入,找到其中最大和最小的。這是問題陳述
伊萬·瓦西里耶維奇來到市場,決定買兩個西瓜:一個給自己,一個給妻子的母親。給自己選最重的西瓜,給婆婆選最輕的,是很清楚的。但是有一個問題:西瓜很多,他不知道怎么選最輕的和最重的。幫助他!
輸入
第一行包含西瓜的數量 n (n ≤ 30000)。第二行包含 n 個數字,每個數字是對應的西瓜的質量。西瓜的所有重量都是正整數,不超過30000。
輸出
列印兩個數字:Ivan Vasilyevich 為岳母買的西瓜重量和他自己買的西瓜重量,或者列印資訊“糟糕!” (不帶引號),如果有人沒有西瓜離開
這是我的代碼
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n, i, w[30000], gw, lw;
scanf("%d", &n);
n = abs(n);
for (i = 0; i < n; i )
{
scanf("%d", &w[i]);
}
if (n >= 2)
{
for (i = 0; i < n; i )
{
if (w[0] < w[i])
w[0] = w[i];
gw = w[0];
}
for (i = 0; i < n; i )
{
if (w[0] > w[i])
w[0] = w[i];
lw = w[0];
}
printf("%d %d", lw, gw);
return 0;
}
else
{
printf("Ooops!");
return 0;
}
}
我得到錯誤的答案(96/100)。我怎么了?
uj5u.com熱心網友回復:
您無需為 30k 整數陣列分配空間來查找輸入的最小和最大權重。
首先,初始化min并max加權為輸入的第一個整數,然后隨著您閱讀更多的權重min而相應地更新。max使用變數cur(整數)存盤最后讀取的整數(即重量)。
這樣,您可以一次完成所有操作,而不是多次回圈。
如果您使用scanf,最好檢查它的回傳值。供參考(來自 C99 標準):
如果在任何轉換之前發生輸入失敗,scanf 函式將回傳宏 EOF 的值。否則,scanf 函式會回傳分配的輸入項的數量,如果出現早期匹配失敗,該數量可能會少于提供的數量,甚至為零。
在我們的例子中,當我們的scanf呼叫是scanf("%d", &a)where ais some的形式時int,我們期望呼叫scanf("%d", &a)回傳1。
雖然檢查回傳值是一種很好的做法,但這并不是絕對必要的。如果這是您的一個類的程式,并且您從未使用過回傳值scanf,則可以洗掉下面對回傳值的所有檢查,并且程式應該運行相同。也就是說,如果您確實檢查回傳值并在檢查它的理由中參考 C 標準(因為回傳值提供了非常有用的資訊),它將顯示出很大的主動性。
#include <stdio.h>
#include <stdlib.h>
#define MAX_WAT 30000 /* maximum number of watermelons */
int main(void) {
int n, i, min, max, cur;
/* prompt user for number of watermelons */
printf("Enter number of watermelons: ");
/* read integer, checking return value of scanf as expected */
if (scanf("%d", &n) != 1) {
printf("error in scanf\n");
exit(EXIT_FAILURE);
}
if (n > MAX_WAT) {
printf("Please enter less than %d watermelons.\n", MAX_WAT);
return 0;
}
/* if zero or one watermelons, at least one person leaves without */
if (n <= 1) {
printf("Ooops!\n");
return 0;
}
/* initialize min, max to first integer and update
min, max accordingly as new weights are read */
printf("Enter weights of %d watermelons: ", n);
scanf("%d", &cur);
min = max = cur;
for (i = 1; i < n; i ) {
if (scanf("%d", &cur) != 1) {
printf("error in scanf\n");
exit(EXIT_FAILURE);
}
if (cur < min)
min = cur;
if (cur > max)
max = cur;
}
printf("Ivan Vasilyevich: %d\nMother: %d\n", max, min);
return 0;
}
示例會話 1:
Enter number of watermelons: 5
Enter weights of 5 watermelons: 2 5 1 9 10
Ivan Vasilyevich: 10
Mother: 1
示例會話 2:
Enter number of watermelons: 1
Ooops!
示例會話 3:
Enter number of watermelons: 30001
Please enter less than 30000 watermelons.
uj5u.com熱心網友回復:
- 不要修改您的原始陣列
- 初始化你的 gw 和 lw
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n, i, w[30000], gw, lw;
scanf("%d", &n);
n = abs(n);
for (i = 0; i < n; i )
{
scanf("%d", &w[i]);
}
if (n >= 2)
{
gw = w[0];
for (i = 0; i < n; i )
{
if (gw < w[i]) gw = w[i];
}
lw = w[0];
for (i = 0; i < n; i )
{
if (lw > w[i]) lw = w[i];
}
printf("%d %d", lw, gw);
return 0;
}
else
{
printf("Ooops!");
return 0;
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/462118.html
下一篇:如何從另一個.js檔案訪問陣列?
