Другие языки программирования и технологии

[С++] Написать программу

Написать программу, которая для чисел в диапазоне от A до B определяла количество их делителей. К примеру, A= 10, B = 15.
Делители для числа 10 - 1 2 5 10
Делители для числа 11 - 1 11
Делители для числа 12 - 1 2 3 4 6 12
Делители для числа 13 - 1 13
Делители для числа 14 - 1 2 7 14
Делители для числа 15 - 1 3 5 15
#include <iostream>
using namespace std;
template<typename Type>
bool is_prime(Type 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 {
Type n;
for (n = 3; n * n <= num && num % n; n += 2) { ; }
prime = n * n > num? true : false;
}
return prime;
}
void func(unsigned a) {
cout << a << " - 1";
if (!is_prime(a)) {
auto mid = a >> 1U;
auto lambda = [=](unsigned i) {
auto x = a / i;
if (x * i == a) cout << ' ' << i;
};
if (a & 1U) for (auto i = 3U; i <= mid; i += 2U) lambda(i);
else for (auto i = 2U; i <= mid; ++i) lambda(i);
}
cout << ' ' << a << '\n';
}
int main() {
cout << ">>> ";
unsigned a, b;
cin >> a >> b;
if (a > b) swap(a, b);
do func(a); while (++a <= b);
system("pause");
}
АН
Антон Новиков
56 600
Лучший ответ
Антон Новиков Надо быстрее? Пожалуйста.
У меня код получился довольно коротким:

#include "iostream"

using namespace std; int f(int n)

{ int k,kol=1; if (n==1) return 1; else { for (k=1; k <= n/2; k++) if (n%k==0) kol+=1; return kol; } }

int main() { k,A,B; for(;;) { cout << "\nA B > "; cin >> A >> B; for (k=A; k <= B; k++) cout << k << '-' << f(k) << ';'; } }

Работает отлично на небольших числах (где-то миллионов до 50, причём все числа диапазона [A..B] для определённости - только натуральные!), а вот чем ближе к одному-двум миллиардам, тем время решения задачи становится всё больше и больше! А если ещё и диапазон слишком широкий (скажем 1000000000..1000010000), то такая программа заставит зависнуть даже хорошую рабочую станцию, потому что алгоритм слишком неэффективный - это расплáта за крáткость кóда, которая отнюдь не всегда сестра таланта!..
Никита Ипатьев
Никита Ипатьев
28 648
Ни здасьте, ни пожалуйста,
Чую, не снискать тут ни денег, ни славы...
Александр Бoсов
Александр Бoсов
10 904
Григорий Здравин Здасьте, пожалуйста :)