最大公約數大於1的最長子陣列


陣列是由儲存在連續記憶體位置的相似資料集組成的集合。透過為資料庫的特定基值定義一個偏移值,可以更輕鬆地評估每個元素的特定位置。該特定索引的基值為零,偏移值是兩個特定索引之差的值。子陣列是特定陣列的一部分,可以定義為一組變數,這些變數共同具有多個值的標籤。最長子陣列是指所有元素都大於 K 的陣列。這裡最大和子陣列的和為:

  • 小於給定資料集。

  • 等於給定資料集。

  • 小於給定資料集。

要找到最長子陣列的長度,我們只需要找出特定子陣列中 1 的總數。注意:計數應該大於零的計數。最大公約數 (GCD) 是一種數學現象,我們找到可以將每個輸入整數除以零餘數的最大的整數值。這裡的條件是,“GCD 大於 1”。這意味著給定的輸入之間至少存在一個公共除數。

Input (array) : arr[] = {4, 3, 2, 2}
Output (after the process with sub-array operation) : 2
If we consider the subarray as {2, 2}, then we will get 2 as GCD. Which is > 1, is of maximum length.

在今天的文章中,我們將學習如何使用 C++ 編碼環境查詢最大公約數大於 1 的最長子陣列。

查詢最大公約數大於 1 的最長子陣列的演算法

在這個特定演算法中,我們可以找出包含大於 1 的最大公約數的子陣列。

  • 步驟 1 - 開始。

  • 步驟 2 - 宣告用於該過程的變數。

  • 步驟 3 - 設定並將其初始化為零值。

  • 步驟 4 - 建立一個函式來評估該子陣列的最大長度。

  • 步驟 5 - 包含一個向量作為引數。

  • 步驟 6 - 建立一個變數來獲取答案。

  • 步驟 7 - 設定並將其初始化為零值。

  • 步驟 8 - 儲存最大公約數大於 1 的最長子陣列的值。

  • 步驟 9 - 迭代迴圈以查詢每個子陣列的最大公約數。

  • 步驟 10 - 用子陣列的長度值替換答案。

  • 步驟 11 - 如果子陣列的最大公約數大於 1,則儲存答案。

  • 步驟 12 - 返回答案。

  • 步驟 13 - 否則,再次執行迴圈並迭代它。

  • 步驟 14 - 過程完成後終止。

查詢最大公約數大於 1 的最長子陣列的語法

int n;
cin >> n;

const int MAX_NUM = 100 * 1000;
static int dp[MAX_NUM];

for(int i = 0; i < n; ++i){
   int x;
   cin >> x;

   int cur = 1;
   vector<int> d;
   for(int i = 2; i * i <= x; ++i){
      if(x % i == 0){
         cur = max(cur, dp[i] + 1);
         cur = max(cur, dp[x / i] + 1);
         d.push_back(i);
         d.push_back(x / i);
      }
   }
   if(x > 1){
      cur = max(cur, dp[x] + 1);
      d.push_back(x);
   }

    for(int j : d){
      dp[j] = cur;
   }
}
cout << *max_element(dp, dp + MAX_NUM) << endl;

按照上述演算法,我們在這裡編寫了可能的語法來查詢最大公約數大於 1 的最長子陣列。

方法:-

  • 方法 1 - 使用樸素方法查詢最大公約數大於 1 的最長子陣列的 C++ 程式。

  • 方法 2 - 查詢陣列的最大公約數是否大於 1 的 C++ 程式。

使用樸素方法查詢最大公約數大於 1 的最長子陣列的 C++ 程式

在這個 C++ 程式碼中,我們應用了樸素方法,透過生成給定陣列的所有可能的子陣列來查詢存在最大公約數大於 1 的最長子陣列。

示例 1

#include <bits/stdc++.h>
using namespace std;
void maxSubarrayLen(int arr[], int n) {
	int maxLen = 0;
	for (int i = 0; i < n; i++) {
		int gcd = 0;
		for (int j = i; j < n; j++) {
			gcd = __gcd(gcd, arr[j]);
			if (gcd > 1)
				maxLen = max(maxLen, j - i + 1);
			else
			   break;
		}
	}
	cout << maxLen;
}
int main() {
	int arr[] = { 410, 16, 7, 180, 222, 10, 33 };
	int N = sizeof(arr) / sizeof(int);
	maxSubarrayLen(arr, N);

	return 0;
}

輸出

3

查詢陣列的最大公約數是否大於 1 的 C++ 程式

在這個 C++ 程式碼中,我們嘗試計算最大公約數,並且它能夠檢查它是否大於 1。

示例 2

#include<bits/stdc++.h>
using namespace std;
int gcd(int a, int b){
   if (a == 0)
      return b;
   return gcd(b%a, a);
}
void bestArray(int arr[], int n){
   bool even[n] = {false};
   int ans = 0;
   for(int i = 0; i < n; i++){
      ans = gcd(ans, arr[i]);
      if(arr[i] % 2 == 0)
         even[i] = true;
   }
   if(ans > 1)
      cout << 0 << endl;
   else {
      ans = 0;
      for(int i = 0; i < n-1; i++){
         if(!even[i]){
            even[i] = true;
            even[i+1] = true;
            if(arr[i+1]%2 != 0){
               ans+=1;
            }
            else
               ans+=2;
         }
      }
      if(!even[n-1]){
         ans+=2;
      }
      cout << ans << endl;
   }
}
int main(){
   int arr[] = {16, 10, 07, 81, 88, 32, 3, 42, 25};
   int n = 9;
   bestArray(arr, n);

   int arr1[] = {16, 7};
   n = 2;
   bestArray(arr1, n);

   int arr2[] = {10, 97, 2001};
   n = 3;
   bestArray(arr2, n);
}

輸出

5
2
1

結論

透過本次討論,我們可以瞭解如何找到最大公約數大於 1 的最長子陣列。希望所寫的演算法和 C++ 程式碼能夠清晰地讓你瞭解這個過程在現實世界中的運作方式。

更新於:2023年4月6日

394 次瀏覽

啟動您的職業生涯

完成課程獲得認證

開始
廣告
© . All rights reserved.