Usuwanie potęg liczb naturalnych ze zbioru

0

witam mam problem z programem nie jestem programistom i muszę wykonać program na zaliczenie na studiach. Z pomocą brata udało nam się coś zrobić ale nie działa jest możliwość zrobienia tego używając prostszych komend ?
Program polega na usunięciu wszystkich potęg liczb pierwszych z n elementowego zbioru.
Z góry dziękuję za pomoc osób które znają się na tym lepiej.
Pozdrawiam.

#include <iostream>
#include <math.h>
#include <vector>
#include <algorithm>

int main() {
	int a;
	std::cout << "Podaj liczbę naturalną: ";
	std::cin >> a;

	std::vector<int> zbior;
	for (int i = 0; i < a; ++i) {
		zbior.push_back(i);
	}

	std::vector<int> pierwsze;
	pierwsze.push_back(2);
	pierwsze.push_back(3);
	for (int i = 2; i < a; i++) {
		for (int j = 2; j*j<=i; j++) {
			if (i % j == 0)
				break;
			else if (j+1 > sqrt(i)) {
				pierwsze.push_back(i);
			}
		}
	}

	int base;
	int acc;
	std::vector<int> potegi;
	potegi.push_back(1); // kazda liczba podniesiona do zerowej potegi to 1
	for (int i = 0; i < pierwsze.size(); i++) {
		potegi.push_back(pierwsze[i]);
		base = pierwsze[i];
		acc = pierwsze[i];
		while (true) {
			if (base * acc < a) {
				potegi.push_back(base * acc);
				acc = base * acc;
			} else {
				break;
			}
		}
	}

	std::cout << "Zbiór: " << std::endl;
	
	for (int i = 0; i < zbior.size(); ++i) {
		std::cout << i << " ";
	}

	std::cout << std::endl;
	
	for (int i = 0; i < a; i++) {
		if (std::find(potegi.begin(), potegi.end(), i) != potegi.end()) {
			zbior.erase(std::remove(zbior.begin(), zbior.end(), i), zbior.end());
		}
	}


	std::cout << "Zbiór po usunięciu potęg liczb pierwszych: " << std::endl;

	for (auto x: zbior) { std::cout << x << " "; }

	std::cout << std::endl;

	return 0;
}
2

Tak to będzie wyglądać, idea podobna do algorytmu Sito Erastotenesa, pseudokod:

fun remove_prime_exp(n):
    arr = [True] * n  # tablica boolean o rozmiarze n, zainicjalizowana wartościami True
    from i = 2 to n:  # iterujemy po indeksach talicy (od 2 w górę, oczywiście)
        if arr[i] is True and is_prime(i):  # jeśli jeszcze nie wykreślona i jest to pierwsza 
            j = i
            s = i
            k = 2
            while j < n:  # w tej pętli wykreślanie wielokrotności - oznaczenie False
                arr[j] = False
                j = pow(s, k)
                k += 1
    output = []
    from i = 0 in to length(arr):
        if arr[i] is True:  # To co zostanie True to liczby nie wykreślone i to zwracamy
            output.append(i)
    return output

Nie Musisz wrzucać liczb do zbioru, liczba naturalna to już jest zbiór:) Acha i pisze się programistą, a nie programistom:)

1 użytkowników online, w tym zalogowanych: 0, gości: 1