Ускоренный вариант, использующий свойство простых чисел (6*n плюс-минус 1). Максимальное число 2
64. Время вычисления максимальных значений (на моём компе) около 10 сек.
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <qmath.h>
#include <QTime>
#define FUNC_FIND_D while(!(n % x))\
{\
sum *= x;\
str += QString::number(x) + " ";\
n /= x;\
if(n % x) str += "\n";\
}
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
private:
Ui::Widget *ui;
QTime m_time;
quint64 t_begin;
public slots:
void press_pbtn_01();
};
#endif // WIDGET_H
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
QObject::connect(ui->pbtn_01,SIGNAL(clicked()),this,SLOT(press_pbtn_01()));
}
Widget::~Widget()
{
delete ui;
}
// start
void Widget::press_pbtn_01()
{
QString str = ui->lineEdit->text();
quint64 n, x;
quint64 sum = 1;
quint64 N = str.toULongLong();
quint64 qn = sqrt(N)/6 + 2;
ui->textEdit->clear();
ui->label_01->clear();
QApplication::processEvents();
// проверка на переполнение
if((N < 1) || (N > 18446744073709551615uL))
{
ui->textEdit->setText("Incorrect (low, large) digit");
return;
}
str = "1\n";
n = N;
// начало отсчёта времени выполнения
m_time.start();
x = 2;
FUNC_FIND_D
x = 3;
FUNC_FIND_D
for(quint64 i = 1; i < qn; i++)
{
x = i * 6 - 1;
FUNC_FIND_D
x++;
x++;
FUNC_FIND_D
}
n = N / sum;
if(n > 1) str += QString::number(n);
// конец отсчёта времени выполнения
qint64 msecs = m_time.elapsed();
QTime time(0,0,0,0);
ui->textEdit->append(str);
ui->label_01->setText(time.addMSecs(msecs).toString("hh:mm:ss.zzz"));
}