題目
本人一開始是這樣寫的:
#include <iostream>
using namespace std;
const int N = 100010;
int n;
int s[N];
int main()
{
cin >> n;
for (int i = 1; i <= n; i ++ )
{
int x;
cin >> x;
s[i] = s[i - 1] + x;
}
int l = 0, r = 0;
while (cin >> l && cin >> r)
{
cout << s[r + 1] - s[l + 1] << endl;
}
return 0;
}
發現結果不對。
仔細再看了一遍程式碼,發現是 cout << s[r + 1] - s[l + 1] << endl;
這一句的問題,應該改成cout << s[r + 1] - s[l] << endl;
,即l + 1
那個位置的數也是在區間[l + 1
, r + 1
]裡的,也要加上。
改成這樣就對了:
#include <iostream>
using namespace std;
const int N = 100010;
int n;
int s[N];
int main()
{
cin >> n;
for (int i = 1; i <= n; i ++ )
{
int x;
cin >> x;
s[i] = s[i - 1] + x;
}
int l = 0, r = 0;
while (cin >> l && cin >> r)
{
cout << s[r + 1] - s[l] << endl;
}
return 0;
}
再補充一個點(在卡哥寫的題解上看到的):
C++ 程式碼 面對大量資料 讀取 輸出操作,最好用scanf 和 printf,耗時會小很多
於是將程式碼改成這樣:
#include <iostream>
using namespace std;
const int N = 100010;
int n;
int s[N];
int main()
{
cin >> n;
for (int i = 1; i <= n; i ++ )
{
int x;
scanf("%d", &x);
s[i] = s[i - 1] + x;
}
int l = 0, r = 0;
while (~scanf("%d %d", &l, &r))
{
printf("%d\n", s[r + 1] - s[l]);
}
return 0;
}
附上兩次的耗時情況:
差距蠻明顯的。
然後注意下這個while迴圈裡面的條件while (~scanf("%d %d", &l, &r))
,不要寫成while (scanf("%d %d", &l, &r))
具體原因如下:
-
scanf
的返回值:-
當 scanf 成功讀取兩個整數時,返回值是 2(表示成功讀取了兩個項)。
-
當遇到檔案結束符(EOF)或者輸入錯誤時,返回值是 EOF(通常是 -1)。
-
-
使用
~
運算子:-
~
是按位取反運算子。它對整數的每一位進行反轉。 -
例如:
-
如果 scanf 返回 2,那麼 ~2 的結果是 -3(因為 ~2 反轉了二進位制的 2,得到 -3)。
-
如果 scanf 返回 -1(即 EOF),那麼 ~-1 的結果是 0(因為 ~-1 反轉了 -1 的二進位制,得到 0)。
-
-
-
迴圈條件的判斷:
在
while (~scanf("%d %d", &l, &r))
中:-
當 scanf 成功讀取兩個整數(返回 2),條件為 while (~2),即 while (-3),這個條件為真,迴圈繼續。
-
當 scanf 返回 EOF(即 -1),條件為 while (~-1),即 while (0),這個條件為假,迴圈結束。
-
補充:
在 C 語言中,while
迴圈的條件判斷是基於真值邏輯的:
-
非零值為真:在 C 語言中,任何非零值都被視為真(true),而 0 被視為假(false)。
-
負數也是非零:雖然 -3 是負數,但它仍然是非零,因此在條件判斷中被視為真。換句話說,while (-3) 是一個真條件,迴圈會繼續執行。
附上一篇部落格cin和scanf的返回值知多少