qt结合c++写一个计算器可以实现大数的阶乘、求n次根号

目前计算器已经有大数的加减乘除,如何添加代码实现阶乘和开n次方
部分代码:
mainwindow,h:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QDebug>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
public:
    QString a1;
    QString a2;
    int flat_d;
    QString num2_dis;
    QString num1_dis;
    QString sum_dis;
    QString oper;
    int flat_alg;

private slots:
    void on_addit_clicked();        //加法
    void on_pushButton_2_clicked(); //清屏
    void on_multip_clicked();       //乘法
    void on_subt_clicked();         //减法
    void on_division_clicked();     //除法
    void on_num_clicked(void);          //数字按键
    void on_SUM_clicked();
    void on_factorial_clicked();
    void on_delete1_clicked();
    void on_minus1_clicked();
public:
    int point1(QString str);            //判断小数点的位置
    int compare_num(QString str1, QString str2);    //比较两个字符串数据的大小
    QString get_num_point(QString str);             //得到数据的小数部分
    QString get_num_positive(QString str);          //得到数据的整数部分
    QString delete_0(QString str1);                 //删除整数前面的0和小数尾部的零

    QString add_pos(QString num1_p, QString num2_p);    //数据小数部分加法
    QString add_poi(QString num1_d, QString num2_d);    //数据整数部分加法
    QString add1(QString str1, QString str2);       //数据的加法
    QString add2(QString str1, QString str2);       //带正负号的加法

    QString subt2(QString str1, QString str2);      //带正负号的减法
    QString subt(QString str1, QString str2);       //两个数据的减法,str1大于str2
    QString sub_int(QString num_b, QString num_s);  //整数部分减法
    QString sub_point(QString num_b, QString num_s);//小数部分减法

    QString mult2(QString str1, QString str2);      //带正负号的乘法
    QString mult(QString str1, QString str2);       //整数乘法

    QString factorial(QString str1, QString str2);  //阶乘

    QString division2(QString str1, QString str2);  //除法
    QString division3(QString str1, QString str2);  //除法
    QString division(QString str1, QString str2, int max);  //除法
    int div1(QString str1, QString str2);       //10倍以内除法
};

#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    qDebug() << __func__ << __LINE__ << "构造函数";
    flat_d = 0;
    flat_alg = 0;
    a1.clear();
    a2.clear();
    num1_dis.clear();
    num2_dis.clear();
    oper.clear();
    connect(ui->pbp, SIGNAL(clicked()), this, SLOT(on_num_clicked()));
    connect(ui->pb0, SIGNAL(clicked()), this, SLOT(on_num_clicked()));
    connect(ui->pb1, SIGNAL(clicked()), this, SLOT(on_num_clicked()));
    connect(ui->pb2, SIGNAL(clicked()), this, SLOT(on_num_clicked()));
    connect(ui->pb3, SIGNAL(clicked()), this, SLOT(on_num_clicked()));
    connect(ui->pb4, SIGNAL(clicked()), this, SLOT(on_num_clicked()));
    connect(ui->pb5, SIGNAL(clicked()), this, SLOT(on_num_clicked()));
    connect(ui->pb6, SIGNAL(clicked()), this, SLOT(on_num_clicked()));
    connect(ui->pb7, SIGNAL(clicked()), this, SLOT(on_num_clicked()));
    connect(ui->pb8, SIGNAL(clicked()), this, SLOT(on_num_clicked()));
    connect(ui->pb9, SIGNAL(clicked()), this, SLOT(on_num_clicked()));

}

MainWindow::~MainWindow()
{
    delete ui;
}
void MainWindow::on_num_clicked(void)       //数字事件
{
    QPushButton *p = static_cast <QPushButton *> (sender());
    ui->lineEdit_2->setText(num2_dis.append(p->text()));
}
void MainWindow::on_minus1_clicked()        //负号事件
{
    num2_dis = ui->lineEdit_2->text();
    if(num2_dis == 0)
        num2_dis = "-" + num2_dis;
    else if(num2_dis.at(0) != '-')
        num2_dis = "-" + num2_dis;
    ui->lineEdit_2->setText(num2_dis);
}

void MainWindow::on_addit_clicked()                     //加法事件
{
    if(ui->lineEdit->text() == 0 && ui->lineEdit_2->text() == 0)
    {
        num1_dis.clear();   num2_dis.clear();
    }
    else if(ui->lineEdit->text() == 0 && ui->lineEdit_2->text() != 0)
    {
        num1_dis = ui->lineEdit_2->text();
        ui->lineEdit->setText(num1_dis.append("+"));
        num2_dis.clear();
        ui->lineEdit_2->setText(num2_dis);
    }
    else if(ui->lineEdit->text() != 0 && ui->lineEdit_2->text() == 0)
    {
        num1_dis = ui->lineEdit->text();
        if(num1_dis.mid(num1_dis.length()-1, 1) == "+")
            ui->lineEdit->setText(num1_dis);
        else if(num1_dis.mid(num1_dis.length()-1, 1) == "-")\
            num1_dis.replace(num1_dis.length()-1, 1, "+");
        else if(num1_dis.mid(num1_dis.length()-1, 1) == "×")\
            num1_dis.replace(num1_dis.length()-1, 1, "+");
        else if(num1_dis.mid(num1_dis.length()-1, 1) == "÷")\
            num1_dis.replace(num1_dis.length()-1, 1, "+");
        else if(num1_dis.mid(num1_dis.length()-1, 1) == "^")\
            num1_dis.replace(num1_dis.length()-1, 1, "+");
        else
            num1_dis.append("+");
        ui->lineEdit->setText(num1_dis);
    }
    else if(ui->lineEdit->text() != 0 && ui->lineEdit_2->text() != 0)
    {
        on_SUM_clicked();
        num1_dis = ui->lineEdit->text();
        num1_dis.append("+");
        ui->lineEdit->setText(num1_dis);
        num1_dis.clear();
    }
}

ui界面

img

#include <QtMath>

int factorial(int n)
{
    if (n == 0) {
        return 1;
    } else {
        return n * factorial(n-1);
    }
}

double exp(double x, int n)
{
    if (n == 0) {
        return 1;
    } else if (n < 0) {
        return 1 / exp(x, -n);
    } else {
        return exp(x * x, n / 2) * (x + (n % 2) * 1.0);
    }
}