Чтобы избежать повторения чисел в массивах в C++

Мой код ниже. Это код C++. Этот код делает общее деление на два числа. Например, если input равен 18,24, output равен 2,2,2,3,3. Но я хочу только 2 и 3 на выходе. Я не могу это исправить. Как я могу это исправить? Спасибо за помощь...

#include<iostream>
using namespace std;
class Ratio {
    public:
        Ratio(int numerator, int denumerator) {
            num=numerator;
            den=denumerator;
        }

        void commondivisor() {
            int arr[20];
            int arr2[20];
            int c=0;
            int c2=0;
            for (int q = 2; num != 1; q ++)
            {
                if (num % q == 0)
                {
                    num /= q;
                    arr[c]=q;
                    q --;
                   c++;   
                }
            }
            cout << endl;

            for (int w = 2; den != 1; w ++)
            {
                if (den % w == 0)
                {
                    den /= w;
                    arr2[c2]=w;
                    w --;
                    c2++;  
                }
            }

            for (int i=0; i<c; i++) {
                for (int j=0; j<c2; j++) {
                    if (arr[i]==arr2[j])
                        cout<<arr2[j];
                }
            }
        }


    private:
        int num;
        int den;
};

int main() {

     int a;
     int b;
     cin >> a;
     cin >> b;
     Ratio nesne(a,b);
     nesne.commondivisor();
     return 0;
}

1 ответ

Ваш алгоритм поиска факторов на самом деле не работает? Например, для чисел 18 и 24 это должно быть {1,2,3,6,9,18} и {1,2,3,4,6,8,12,24} соответственно - включая 1 и сам номер. Вы получаете {2,3,3} и {2,2,2,3} соответственно.

std::vector<int> factors(int num) {
     std::vector<int> fac_vec;
     for (int i = 1; i <= num; i++)
         if (num % i == 0)
             fac_vec.push_back(i);
     return fac_vec;
 }

Это работает, думал, что это ни в коем случае не эффективно. Чтобы найти общие элементы, вы можете выполнить итерацию с помощью вложенного цикла. Опять же, не очень эффективно, тем более что векторы / массивы отсортированы. Смотрите пример ниже.

std::vector<int> find_common(std::vector<int>& l, std::vector<int>& r) {
    std::vector< int > common_vec;
    for (auto il : l)
         for (auto ir : r)
             if (il == ir)
                 common_vec.push_back(ir);
    return common_vec;
 }
Другие вопросы по тегам