Алгоритм не мой, я только "перелицевал" его с С на Qt C++. Как работает - не знаю. Но работает. 3200 знаков вычисляет за доли секунды (на моём компе).
Оригинал программы на С:
C
int a=10000,b,c=2800,d,e,f[2801],g;main(){for(;b-c;)f[b++]=a/5; for(;d=0,g=c*2;c-=14,printf("%.4d",e+d/a),e=d%a)for(b=c;d+=f[b]*a, f[b]=d%--g,d/=g--,--b;d*=b);}
Код программы на С++. Хедер не выкладываю, там только слот кнопки.
#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;
}
void Widget::press_pbtn_01()
{
quint64 a = 10000;
quint64 b;
quint64 c = 11200; //2800 5600 11200 22400 89600 112000
quint64 d;
quint64 e = 0;
quint64 f[11201]; //2801 5601 11201 22401 89601 112001
quint64 g;
quint32 x;
quint32 cx = 0;
QString str;
//заполняет массив значением а/5 = 2000
for (b = 0; b < c+1; b++) f[b] = a/5;
//вычисление
while(c)
{
d = 0;
g = c * 2;
for (b = c; b > 1; b--)
{
d += f[b] * a;
g--;
f[b] = d % g;
d /= g;
g--;
d *= b;
}
x = e + d/a;
// строка для вывода на экран
// добавляется по 4 цифры
// дополняется спереди нулями до 000X
str += QString::number(x).rightJustified(4, '0');
// число знаков
cx++;
c -= 14;
e = d % a;
}
ui->label_02->setText(QString::number(cx*4));
ui->textEdit->append(str);
}