Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

С++ Задание на массив

Nayshes Профи (617), закрыт 4 года назад
Удалить из массива целых чисел все двузначные элементы, являющиеся
простыми числами. Найти среднее арифметическое элементов массива до
и после удаления. Проверить, изменился ли максимальный элемент
массива.
Сидел решал, решал. Понял что нужно решать через решетом Эратосфена чтобы найти все простые и двузначные числа. Вот мой код, мне кажется, что я вообще не так немного решаю, помогите плес

#include iostream
#include cmath
using namespace std;
main()
{
int* A;
int s,N,i,k;

N=100;
A = new int [N+1];
for(i = 10; i <= N; i++)
A[ i ]=1;
for(k = 2; k <= sqrt(N); k++)
if (A[ k ])
{
for (i = 2*k; i <= N; i+=k)
if (A[ i ])
A[ i ]=0;
}
for(i = 10; i <= N; i++)
{
if (A [ i ])
cout<< i<< " \n";

}
for(i=10;i<=N;i++)
{
}

return 0;

}
Лучший ответ
Николай Веселуха Высший разум (360748) 4 года назад
#include <iostream>
#include <random>
#include <iomanip>
using namespace std;
using condition = bool (*)(unsigned value);
bool accord(unsigned value) {
return 2 == static_cast<int>(log10(value)) + 1;
}
bool is_prime(unsigned num) {
bool prime;
if (num <= 5 && (num <= 2 || num == 3 || num == 5)) prime = true;
else if (~num & 1 || 0 == num % 3 || 0 == num % 5) prime = false;
else {
unsigned n;
for (n = 3; n * n <= num && num % n; n += 2) { ; }
prime = n * n > num? true : false;
}
return prime;
}
void fill_rand(unsigned* box, const size_t n, unsigned left, unsigned right) {
if (left > right) swap(left, right);
uniform_int_distribution<unsigned> uid(left, right);
mt19937 gen{ random_device()() };
for (auto i = 0U; i < n; ++i) box[i] = uid(gen);
}
size_t input(const char* msg) {
cout << msg;
size_t value;
cin >> value;
return value;
}
unsigned* create_array(const size_t n) {
return new unsigned[n];
}
unsigned* destroy(unsigned* p) {
if (p != nullptr) delete[] p;
return nullptr;
}
void show(unsigned* p, const size_t n, streamsize w = 4) {
for (auto i = 0U; i < n; ++i) cout << setw(w) << p[i];
cout.put('\n');
}
unsigned* shift(unsigned* start, const unsigned* end) {
auto prev = start;
auto curr = start + 1;
while (curr < end) *prev++ = *curr++;
return start;
}
size_t remove_prime(unsigned* p, size_t n, condition f) {
for (auto i = 0U; i < n; ++i) {
auto e = p + n;
if (f(p[i]) && is_prime(p[i])) {
shift(&p[i], e);
--n;
}
}
return n;
}
double average(unsigned* p, size_t n) {
auto s = .0;
for (auto i = 0U; i < n; ++i) s += p[i];
return s / n;
}
int main() {
system("chcp 1251 > nul");
auto n = input("Размер массива: ");
auto p = create_array(n);
fill_rand(p, n, 1, 25);
show(p, n);
cout << "Среднее арифметическое до: " << average(p, n) << '\n';
n = remove_prime(p, n, accord);
show(p, n);
cout << "Среднее арифметическое после: " << average(p, n) << '\n';
p = destroy(p);
system("pause");
}
Остальные ответы
Похожие вопросы