在 C++ 中列印至少能被陣列中其他元素整除的陣列元素


在這個問題中,我們得到一個整數陣列,我們必須只打印那些至少能被陣列中其他一個元素整除的數字。

讓我們舉個例子來更好地理解這個概念:

Input  : 3 12 16 21
Output : 12 21

解釋 − 3是最小的,所以它可以被任何其他數字整除,12能被3整除,16不能被3整除,21能被3整除。因此,我們將忽略3和16。

一種簡單的方法是檢查所有元素是否都能被陣列中的任何其他元素整除。但這並不是解決這個問題的最佳方案。

使用雜湊表可能是一個更好的解決方案。我們將陣列元素儲存在雜湊表中,然後找到陣列的最大元素。然後,對於這個最大元素,找到給定數字的倍數,如果在雜湊表中找到了倍數,則該元素至少能被陣列中的一個元素整除。像這樣,我們將列印至少能被陣列中一個元素整除的元素。

示例

現在,基於這個概念,讓我們建立一個程式:

線上演示

#include <bits/stdc++.h>
using namespace std;
void printDivisibleNumber(int arr[], int n){
   unordered_set<int> s;
   int maxElement = INT_MIN;
   for (int i = 0; i < n; i++) {
      s.insert(arr[i]);
      maxElement = max(maxElement, arr[i]);
   }
   unordered_set<int> res;
   for (int i = 0; i < n; i++) {
      if (arr[i] != 0) {
         for (int j = arr[i] * 2; j <= maxElement; j += arr[i]) {
            if (s.find(j) != s.end())
               res.insert(j);
            }
         }
      }
   unordered_map<int, int> mp;
   for (int i = 0; i <n; i++)
      mp[arr[i]]++;
   unordered_map<int, int>::iterator it;
   vector<int> ans;
   for (it = mp.begin(); it != mp.end(); it++) {
      if (it->second >= 2) {
         if (res.find(it->first) == res.end()) {
            int val = it->second;
            while (val--)
               ans.push_back(it->first);
         }
      }
      if (res.find(it->first) != res.end()) {
         int val = it->second;
         while (val--)
            ans.push_back(it->first);
      }
   }
   for (auto x : ans)
      cout<<x<<"\t";
}
int main(){
   int arr[] = {2, 4, 7 , 12 , 14 };
   int n = sizeof(arr) / sizeof(arr[0]);
   printDivisibleNumber(arr, n);
   return 0;
}

輸出

12 14 4

更新於:2020年1月3日

301 次瀏覽

啟動你的職業生涯

透過完成課程獲得認證

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