58. 區間和

hisun9發表於2024-10-30

題目

本人一開始是這樣寫的:

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

附上兩次的耗時情況:

img

差距蠻明顯的。

然後注意下這個while迴圈裡面的條件while (~scanf("%d %d", &l, &r)),不要寫成while (scanf("%d %d", &l, &r))

具體原因如下:

  1. scanf的返回值:

    • 當 scanf 成功讀取兩個整數時,返回值是 2(表示成功讀取了兩個項)。

    • 當遇到檔案結束符(EOF)或者輸入錯誤時,返回值是 EOF(通常是 -1)。

  2. 使用 ~ 運算子:

    • ~ 是按位取反運算子。它對整數的每一位進行反轉。

    • 例如:

      • 如果 scanf 返回 2,那麼 ~2 的結果是 -3(因為 ~2 反轉了二進位制的 2,得到 -3)。

      • 如果 scanf 返回 -1(即 EOF),那麼 ~-1 的結果是 0(因為 ~-1 反轉了 -1 的二進位制,得到 0)。

  3. 迴圈條件的判斷:

    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的返回值知多少

相關文章