C/C++

Помогите решить алгоритм на с++

Для алгоритма подсчета делителя числа измените его, чтобы получить делитель в порядке возрастания.

Целое число N – получить делители меньше N

{
for i from 2 to sqrt(N)
if (N%i == 0)
write i
for i from 2 to sqrt(N)
if (N%i == 0)
write N/i
}
В В
В В
94
второй цикл перевернуть: for i from sqrt(N) to 2

 #include 
int main()
{
int n = 900; //задаем число
int sqr_t = sqrt(n); //вычисляем корень
bool d_sqrt = n == sqr_t * sqr_t; //поправка для второго цикла
//чтобы не выводить два раза корень
for (int i = 2; i
Азиз Эргешев
Азиз Эргешев
51 416
Лучший ответ
Для четырёхзначных беззнаковых целых чисел (до 2³²-1=4294967295 включительно):
#include <vector>
#include <cmath>
#include <iomanip>
#include <iostream>
#include <algorithm>
using namespace std; int main()
{ vector <unsigned long> d;
unsigned long i, j, n, t, N; while (true)
{ cout << "N: "; cin >> N; if (N > 1) { j = 0;
n = sqrt(N); for (i = 1; i <= n; i++) if (N % i == 0)
{ d.push_back(i); if (i * i != N) d.push_back(N / i); }
sort(d.begin(), d.end());
for (i = 0; i < d.size() - 1; i++)
cout << setw(4) << i + 1 << ") "
<< d[i] << endl; } d.clear(); } }
Здесь всё работает исключительно быстро. Но для восьмибайтных беззнаковых целых чисел типа unsigned long long этот переборный алгоритм слишком слабый и нужна его существенная переработка. Вот пример использования такого алгоритма для достаточно больших N:У меня на смартпэде введённое число обрабатывается почти четыре минуты как раз из за неоптимальности такого простого переборa. Зато с типом unsigned long программа, приведённая выше, просто летает!
Мr Carleone
Мr Carleone
66 572
 #include  
#include
#include

using namespace std;
typedef long long ll;


void printDivs(ll &k){
vector d;
for(int i = 1; i * i = 0; i--) d.push_back(k / d[i]);
for(auto &i: d) cout n;
printDivs(n);
}