在 C++ 中查詢最大的 N,使得前 N 個自然數的平方和不大於 X


概念

對於給定的整數 X,我們的任務是確定最大的 N 值,使得前 N 個自然數的平方和不超過 X。

輸入

X = 7

輸出

2

2 是 N 的最大可能值,因為當 N = 3 時,級數之和將超過 X,即 1^2 + 2^2 + 3^2 = 1 + 4 + 9 = 14

輸入

X = 27

輸出

3

3 是 N 的最大可能值,因為當 N = 4 時,級數之和將超過 X,即 1^2 + 2^2 + 3^2 + 4^2 = 1 + 4 + 9 + 16 = 30

方法

簡單解法 − 這裡,一個簡單的解法是從 1 迴圈到最大 N,使得 S(N) ≤ X,其中 S(N) 表示前 N 個自然數的平方和。前 N 個自然數的平方和由公式 S(N) = N * (N + 1) * (2 * N + 1) / 6 給出。

需要注意的是,這種方法的時間複雜度為 O(N)。

高效解法 − 我們可以實現另一種基於二分查詢方法的高效解法。

我們按照以下逐步解釋的演算法:

  • 在較大陣列中開始二分查詢,並將中間值設為 (low + high) / 2

  • 如果兩個陣列的值相同,則元素必須在右側,因此將 low 設為 mid

  • 否則,如果中間元素不相等,則將 high 設為 mid,因為元素必須在較大陣列的左側。

需要注意的是,這種方法的時間複雜度為 O(log N)。

示例

 線上演示

// C++ implementation of the approach
#include <bits/stdc++.h>
using namespace std;
#define ll long long
// Shows function to return the sum of the squares
// of first N1 natural numbers
ll squareSum(ll N1){
   ll sum1 = (ll)(N1 * (N1 + 1) * (2 * N1 + 1)) / 6;
   return sum1;
}
// Shows function to return the maximum N such that
// the sum of the squares of first N
// natural numbers is not more than X
ll findMaxN(ll X){
   ll low1 = 1, high1 = 100000;
   int N1 = 0;
   while (low1 <= high1) {
      ll mid1 = (high1 + low1) / 2;
      if (squareSum(mid1) <= X) {
         N1 = mid1;
         low1 = mid1 + 1;
      }
      else
         high1 = mid1 - 1;
   }
   return N1;
}
// Driver code
int main(){
   ll X = 27;
   cout << findMaxN(X);
   return 0;
}

輸出

3

更新於:2020年7月25日

345 次瀏覽

開啟你的職業生涯

完成課程獲得認證

開始學習
廣告
© . All rights reserved.