1. 程式人生 > >Qt編寫的大資料的運算,包括基礎的四則運算,階乘

Qt編寫的大資料的運算,包括基礎的四則運算,階乘

編寫背景:在平常的程式設計中我們會遇到很多的大資料,這些資料的值超出了整型int的最大範圍;甚至超過了long long的資料範圍;遇到這種情況,我們的資料處理就會變的十分的麻煩。因為我們不可以使用整型變數來表示這些值當然也就不可使用四則運算來,就算這些值的加減乘除的算術。當遇到這種情況的時候,我麼就需要來使用字串來表示一個數 ; 當然,也要使用字串來進行相應的四則運算了; 環境:QT編譯器; 使用語言:C++;

基本思路:

加法和減法是最基礎的演算法,要想實現乘法和除法的運算必定要先實現加法和減法的運算; 加法: 資料的加法是以小數點為中軸對齊進行計算;整數部分是以個位數開始,相加大於十就向前進一位;小數部分先把兩個字串補齊到一樣長,然後按照整數部分加法進行計算;先計算小數部分,後計算整數部分; 減法: 資料的減法,依舊是先計算小數,後計算整數,把資料每一個單數轉換成整型;減去減數每一個單數的整型;如果不夠,則借一位; 乘法: 用兩個for迴圈,內迴圈是迴圈被乘數,外迴圈為迴圈乘數;內迴圈每次取被乘數的一位,乘以外迴圈的一位數; 最後把每次外迴圈所得到的數相加, 除法: 由於除數和被除數都是大資料,所以,每次取除數長度的被除數與除數相除;而所取的被除數是用乘法迴圈0-9進行判斷,得到單個的商; 單個的商乘以除數,與取得指定長度被除數相減;得到的差插入到剩下的被除數前面; 然後迴圈;

程式原始碼:

1、big_data.pro部分

QT       += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = big_data
TEMPLATE = app
SOURCES += main.cpp\
        mainwindow.cpp
HEADERS  += mainwindow.h
FORMS    += mainwindow.ui

2、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

3、main.cpp部分

#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}

4、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();
    }
}

void MainWindow::on_subt_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();
    }

}

void MainWindow::on_multip_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();
    }

}

void MainWindow::on_division_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();
    }
}

void MainWindow::on_factorial_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();
    }
}

void MainWindow::on_SUM_clicked()               //等號事件
{
    num2_dis = ui->lineEdit_2->text();
    if(num2_dis.length() == 1)
        if(num2_dis.at(num2_dis.length()-1) == '-')
            num2_dis.clear();
    int count = 0;
    for(int i = 0; i < num2_dis.length(); i++)
        if(num2_dis.at(i) == '.')
            count++;
    if(count > 1)
        num2_dis.clear();
    num1_dis = ui->lineEdit->text();
    if(num1_dis.length() == 2)
        if(num1_dis.at(0) == '-')
            num1_dis.replace(0,1,"");
    oper.clear();
    oper = num1_dis.mid(num1_dis.length()-1, 1);

    if(oper == "+")
    {
        num1_dis = num1_dis.mid(0, num1_dis.length()-1);
        num1_dis = add2(num1_dis,num2_dis);
        ui->lineEdit->setText(num1_dis);
        num1_dis.clear();
        num2_dis.clear();
        ui->lineEdit_2->setText(num2_dis);
    }
    else if(oper == "-")
    {
        num1_dis = num1_dis.mid(0, num1_dis.length()-1);
        num1_dis = subt2(num1_dis,num2_dis);
        ui->lineEdit->setText(num1_dis);
        num1_dis.clear();
        num2_dis.clear();
        ui->lineEdit_2->setText(num2_dis);
    }
    else if(oper == "×")
    {
        num1_dis = num1_dis.mid(0, num1_dis.length()-1);
        num1_dis = mult2(num1_dis,num2_dis);
        ui->lineEdit->setText(num1_dis);
        num1_dis.clear();
        num2_dis.clear();
        ui->lineEdit_2->setText(num2_dis);
    }
    else if(oper == "÷")
    {
        num1_dis = num1_dis.mid(0, num1_dis.length()-1);
        num1_dis = division3(num1_dis,num2_dis);
        ui->lineEdit->setText(num1_dis);
        num1_dis.clear();
        num2_dis.clear();
        ui->lineEdit_2->setText(num2_dis);
    }
    else if(oper == "^")
    {
        num1_dis = num1_dis.mid(0, num1_dis.length()-1);
        num1_dis = factorial(num1_dis,num2_dis);
        ui->lineEdit->setText(num1_dis);
        num1_dis.clear();
        num2_dis.clear();
        ui->lineEdit_2->setText(num2_dis);
    }
    else
    {
        num1_dis = num2_dis;
        ui->lineEdit->setText(num1_dis);
        num1_dis.clear();
        num2_dis.clear();
        ui->lineEdit_2->setText(num2_dis);
    }
}
void MainWindow::on_delete1_clicked()       //刪除事件
{
    num2_dis = ui->lineEdit_2->text();
    num2_dis = num2_dis.mid(0, num2_dis.length()-1);
    ui->lineEdit_2->setText(num2_dis);
}
void MainWindow::on_pushButton_2_clicked()  //清屏
{
    a1.clear();
    a2.clear();
    num1_dis.clear();
    num2_dis.clear();
    sum_dis.clear();
    flat_d = 0;
    ui->lineEdit->setText(0);
    ui->lineEdit_2->setText(0);
}

/*#################################################################################################################################*/

int MainWindow::point1(QString str)                 //判斷小數點的位置
{
    int i = 0;
    int flat = 0;
    for(int j = 0; j < str.length(); j++)
    {
        if(str.at(j) == '.')
            flat++;
    }
    if(flat == 0)
        return str.length();
    else if (flat > 1)
        return -1;
    while(str.at(i) != '.')
    {
        i++;
    }
    return i;
}
QString MainWindow::get_num_positive(QString str)   //得到資料的整數部分
{
    if(point1(str) == -1)
        return "資料錯誤";
    return str.mid(0,point1(str));
}
QString MainWindow::get_num_point(QString str)      //得到資料的小數部分
{
    if(point1(str) == -1)
        return "資料錯誤";
    return str.mid(point1(str)+1, str.length()-point1(str));
}
int MainWindow::compare_num(QString str1, QString str2)     //判斷兩個資料的大小。1,0,-1
{
    QString num1_int = get_num_positive(str1);
    QString num2_int = get_num_positive(str2);
    num1_int = delete_0(num1_int);
    if(num1_int.length() > num2_int.length())
        return 1;
    else if(num1_int.length() < num2_int.length())
        return -1;

    int i = 0;
    while(num1_int.mid(i,1) == num2_int.mid(i,1) && i<num1_int.length())
         i++;
    if(num1_int.mid(i,1).toInt() > num2_int.mid(i,1).toInt())
        return 1;
    else if(num1_int.mid(i,1).toInt() < num2_int.mid(i,1).toInt())
        return -1;

    QString num1_point = get_num_point(str1);
    QString num2_point = get_num_point(str2);
    int j = 0;
    while(num1_point.mid(j,1) == num2_point.mid(j,1) && j < num1_point.length())
        j++;
    if(num1_point.mid(j,1).toInt() > num2_point.mid(j,1).toInt())
        return 1;
    else if(num2_point.mid(j,1).toInt() < num2_point.mid(j,1).toInt())
        return -1;
    if(num1_point.length() < num2_point.length())
        return -1;
    return 0;
}
QString MainWindow::delete_0(QString str1)                  //刪除資料開頭的和小數尾部的0
{
    QString ret;    ret.clear();
    int s = 0;
    if (str1.length() == 0)
        return "0";
    while (str1.at(s) == '0')
    {
        s++;
        if(str1.length() == s)
            break;
    }
    ret = str1.replace(0, s, "");
    if(get_num_point(str1).length() > 0)
    {
        int j = 0;
        while(str1.at(str1.length()-j-1) == '0')
            j++;
        ret = str1.replace(str1.length()-j, j, "");
    }
    else
        ret = get_num_positive(str1);
    if(ret.length() > 0)
    {
        if(ret.at(0) == '.')
            ret.insert(0, "0");
        if(ret.at(ret.length()-1) == '.')
            ret.replace(ret.length()-1, 1, "");
    }
    return ret;
}

/*#################################################################################################################################*/
QString MainWindow::add2(QString str1, QString str2)    //兩個帶符號的數相加
{

    QString str_ret;    str_ret.clear();
    if(str1.at(0) == '-' && str2.at(0) == '-')
    {
        str_ret = add1(str1,str2);
        str_ret = "-" + delete_0(str_ret);
    }
    else if(str1.at(0) != '-' && str2.at(0) == '-')
    {
        str_ret = subt(str1, str2);
        str_ret = delete_0(str_ret);
    }
    else if(str1.at(0) == '-' && str2.at(0) != '-')
    {
        str_ret = subt(str2, str1);
        str_ret = delete_0(str_ret);
    }
    else
        str_ret = add1(str1,str2);

    return str_ret;
}
QString MainWindow::add1(QString str1, QString str2)    //兩個正數資料相加
{
    QString sum_add; sum_add.clear();    flat_d = 0;
    QString num1_p = get_num_positive(str1);
    QString num2_p = get_num_positive(str2);
    QString num1_d = get_num_point(str1);
    QString num2_d = get_num_point(str2);

    QString sum_d = add_poi(num1_d,num2_d); //先計算小數,得到flat_d的值
    QString sum_p = add_pos(num1_p, num2_p);
    if( flat_d >= 1)
        sum_add = add_pos(sum_p, QString::number(flat_d)) + sum_d;
    else if(flat_d == 0)
        sum_add = sum_p + sum_d;
    sum_add = delete_0(sum_add);            //#bug點2,已解決
    return sum_add;
}

QString MainWindow::subt2(QString str1, QString str2)   //兩個帶符號的資料相減
{
    QString sum_ret; sum_ret.clear();
    if(str1.at(0) == '-' && str2.at(0) == '-')          //負數減負數
    {
        sum_ret = subt(str1, str2);
        if(sum_ret.at(0) != '-')                        //-12 - -3
            sum_ret.insert(0,"-");
        else                                            //-3 - -12
            sum_ret.replace(0, 1, "");
    }
    else if(str1.at(0) != '-' && str2.at(0) == '-')     //正數減負數
    {
          sum_ret = add1(str1, str2);
    }
    else if(str1.at(0) == '-' && str2.at(0) != '-')     //負數減正數
    {
          sum_ret = add1(str1, str2);
          sum_ret.insert(0, "-");
    }
    else
       sum_ret = subt(str1, str2);
    return sum_ret;
}
QString MainWindow::subt(QString str1, QString str2)    //減法
{
    QString sum_s;  sum_s.clear();
    int flat_s = 0;
    if (compare_num(str1, str2) == 0)
        sum_s = "0";
    QString num_b, num_s;
    if(compare_num(str1, str2) == 1)
    {
        num_b = str1;
        num_s = str2;
        flat_s = 1;
    }
    else if(compare_num(str1, str2) == -1)
    {
        num_b = str2;
        num_s = str1;
        flat_s = -1;
    }
    sum_s = sub_point(num_b,num_s);
    sum_s = sub_int(num_b,num_s) + "." +sum_s;
    sum_s = delete_0(sum_s);
    if(flat_s == -1)
        sum_s = "-" + sum_s;
    if(sum_s.mid(sum_s.length()-1, 1) == ".")
        sum_s = sum_s.mid(0, sum_s.length()-1);
    return sum_s;
}

QString MainWindow::mult2(QString str1, QString str2)
{
    QString sum_ret; sum_ret.clear();
    if(str1.at(0) != '-' && str2.at(0) == '-')     //正數乘負數
    {
          sum_ret = mult(str1, str2);
          sum_ret.insert(0, "-");
    }
    else if(str1.at(0) == '-' && str2.at(0) != '-')     //負數乘正數
    {
        sum_ret = mult(str1, str2);
        sum_ret.insert(0, "-");
    }
    else
       sum_ret = mult(str1, str2);

    return sum_ret;
}
QString MainWindow::mult(QString str1, QString str2)    //乘法
{
    QString sum_mul;    sum_mul.clear();
    int n_point = get_num_point(str1).length() + get_num_point(str2).length();
    QString num1 = get_num_positive(str1) + get_num_point(str1);
    QString num2 = get_num_positive(str2) + get_num_point(str2);
    QString sum_g;
    int num, flat = 0;
    for(int i = 1; i <= num1.length(); i++)         //num1為乘數,num2為被乘數
    {
        for(int j = 1; j <= num2.length(); j++)
        {
            num = num2.mid(num2.length()-j, 1).toInt() * num1.mid(num1.length()-i, 1).toInt() + flat;
            if(num >= 10)
            {
                flat = QString::number(num).mid(0,1).toInt();
                sum_g.insert(0, QString::number(num).mid(1,1));
            }
            else
            {
                sum_g.insert(0,QString::number(num));
                flat = 0;
            }
        }
        if(flat > 0)
        {
            sum_g.insert(0, QString::number(flat));
            flat = 0;
        }
        while(sum_g.length() <= n_point-i+1)
            sum_g.insert(0, "0");
        sum_g.insert(sum_g.length()-n_point+i-1, ".");
        sum_mul = add1(sum_mul, sum_g);         //問題點,已解決

        sum_g.clear();
    }
    sum_mul = delete_0(sum_mul);
    return sum_mul;
}

QString MainWindow::factorial(QString str1, QString str2)   //階乘
{
    QString ret_fac; ret_fac = "1";
    if(str2.at(0) == '-')
        return str1;
    if(get_num_point(str2).length() != 0)
        return str1;
    int num = str2.toInt();
    for (int i = 0; i < num; i++)
        ret_fac = mult2(ret_fac, str1);
    return ret_fac;
}

QString MainWindow::division3(QString str1, QString str2)   //除法,帶正負號
{
    QString ret_div; ret_div.clear();
    int flat_m = 1;
    if(str1.at(0) == '-' && str2.at(0) != '-')
    {
        str1 = str1.mid(1,-1);
        flat_m = -1;
    }
    else if(str1.at(0) != '-' && str2.at(0) == '-')
    {
        str2 = str2.mid(1, -1);
        flat_m = -1;
    }
    else if(str1.at(0) == '-' && str2.at(0) == '-')
    {
        str1 = str1.mid(1,-1);
        str2 = str2.mid(1, -1);
        flat_m = 0;
    }
    else
        flat_m = 0;
    ret_div = division2(str1, str2);
    if(flat_m == -1)
        ret_div.insert(0,"-");
    return ret_div;
}

QString MainWindow::division2(QString str1, QString str2)   //除法,帶小數
{
    QString ret_div;    ret_div.clear();
    str1 = delete_0(str1); str2 = delete_0(str2);
    if(str1 == "0" || str1 == "")
        return "0";
    if(str2 == "0" || str2 == "")
        return str1.append("÷");

    int str1_len = get_num_point(str1).length();
    int str2_len = get_num_point(str2).length();
    int poi_len = str1_len - str2_len;
    int flat1;

    QString num1_div = get_num_positive(str1) + get_num_point(str1);
    QString num2_div = get_num_positive(str2) + get_num_point(str2);
    QString fnum1 = num1_div.mid(0, num2_div.length());

    if(compare_num(fnum1, num2_div) != -1)
        flat1 = num1_div.length() - num2_div.length() + 1 - poi_len;
    else
        flat1 = num1_div.length() -  num2_div.length() - poi_len;

    int flat2 = flat1 + 10;
    ret_div = division(num1_div, num2_div, flat2);
    ret_div.insert(flat1, ".");
    ret_div = delete_0(ret_div);
    return ret_div;
}

QString MainWindow::division(QString str1, QString str2, int max)    //除法兩串資料相除,得到一串未處理的資料
{
    QString sum_div;    sum_div.clear();
    int num2_len = str2.length();
    QString fsub, fmul, fnum1, fnum2;
    fnum2 = str1;
    for(int i = 0; i < max; i++)
    {
        fnum1 = fnum2.mid(0, num2_len);  //取num1的前num2_len位
        if(compare_num(fnum1, str2) != -1)
        {
            fnum2 = fnum2.mid(num2_len, -1);
        }
        else
        {
            if(fnum2.length() <= num2_len)
            {
                fnum1 = fnum2.append("0");
                fnum2 = fnum2.mid(num2_len+1, -1);
            }
            else
            {
                fnum1 = fnum2.mid(0, num2_len+1);
                fnum2 = fnum2.mid(num2_len+1, -1);
            }
        }
        int num = div1(fnum1, str2);
        sum_div.append(QString::number(num));
        fmul = mult(str2, QString::number(num));
        if (compare_num(fnum1, fmul) == 1)
            fsub = subt(fnum1, fmul);
        else
            fsub = "0";
        fnum2.insert(0, fsub);
        fsub.clear();
    }
    return sum_div;
}

int MainWindow::div1(QString str1, QString str2)       //10倍內除法
{
    int i;
    for( i = 0; i < 10; i++)
    {
        if(compare_num(str1, mult(str2, QString::number(i))) == -1)
            break;
    }
    if(i > 0)
        i--;
    return i;
}

QString MainWindow::add_pos(QString num1_p, QString num2_p) //整數部分加法
{
    QString sum_p;  sum_p.clear();
    int flat = 0;   int num = 0;
    int big;
    if(num1_p.length() >= num2_p.length())
        big = num1_p.length();
    else {
        big = num2_p.length();
    }

    for (int i = 1; i <= big; i++)
    {
        num = num1_p.mid(num1_p.length()-i,1).toInt() + num2_p.mid(num2_p.length()-i,1).toInt() + flat;
        if (num >= 10)
        {
            flat = QString::number(num).mid(0,1).toInt();
            sum_p.insert(0,QString::number(num).mid(1,1));
        }
        else if(num >=0 && num <10)
        {
            sum_p.insert(0,QString::number(num));
            flat = 0;
        }
    }
    if (flat != 0)
        sum_p.insert(0,QString::number(flat));
    return sum_p;
}

QString MainWindow::add_poi(QString num1_d, QString num2_d) //小數部分加法
{
    QString sum_d;  sum_d.clear();
    if(num1_d == "" && num2_d == "")
        return sum_d;
    else if(num1_d == "" && num2_d != "")
        return "." + num2_d;
    else if(num1_d != "" && num2_d == 
            
           

相關推薦

Qt編寫資料屏UI看板系統

前言 目前大屏大資料視覺化UI這塊非常火,趁熱也用Qt來實現一個,Qt這個一站式超大型GUI超市,沒有什麼他做不了的,大屏電子看板

Qt編寫資料運算包括基礎四則運算

編寫背景:在平常的程式設計中我們會遇到很多的大資料,這些資料的值超出了整型int的最大範圍;甚至超過了long long的資料範圍;遇到這種情況,我們的資料處理就會變的十分的麻煩。因為我們不可以使用整型變數來表示這些值當然也就不可使用四則運算來,就算這些值的加減

學習資料分析要什麼基礎基礎入門ok嗎?

CDA資料分析師原創作品 身處21世紀的今天,資料分析行業急劇發展,越來越多的企業已經意識到大資料分析的重要性和發展潛力,同時越來越多的傳統行業公司開始轉型升級,開始引入並發展專屬自己的大資料分析部門及崗位。由此也滋生了越來越多的人想進入大資料領域——或許你是即將畢業的大學生,基於自己的文科背景擔憂自己

基於Java的整數運算的實現(加法減法乘法)學習筆記

-1 urn 相加 his add oid one 我會 後來 大整數,顧名思義就是特別大的整數。 一臺64位的機器最大能表示的數字是2的64次方減一: 18446744073709551615 java語言中所能表示的整數(int)最小為-2147483648 pu

報名 | 資料應用中日交流論壇共探資料應用與政策制度差異

正值中日和平友好條約簽訂40週年,清華資料科學研究院特於11月15日與清華大學·野村綜研中國研究中心聯合舉辦大資料應用中日交流論壇。為加強中日雙方對資料科學學科的交流,促進科研合作,互相學習,共同進步,本場論壇邀請中日雙方資料科學領域的專家、學者及企業代表共聚一堂,交流中日資料使

0基礎怎麼學習資料?給零基礎學習者支幾招

小白如何學習大資料技術?大資料怎麼入門?怎麼做大資料分析?資料科學需要學習那些技術?大資料的應用前景等等問題,已成為熱門大資料領域熱門問題,以下是對新手如何學習大資料技術問題的解答~ 大資料開發學習可以按照以下內容進行學習 第一階段:JavaSE+MySql+Linux 學習內容:Java 語言入門 →

遇到資料行業的職業發展瓶頸你有勇氣去突破?

大資料行業的發展不是一直呈現指數增長的,而且作為身在其中的大資料行業從業者,大家或快或慢的都會遇到職業瓶頸,今天我們就聊聊資料人才的瓶頸有哪些,該如何去突破。   每個人在不同的成長階段都會遇到瓶頸,就拿我自己來說,讀書時代由於沒有找到正確的學習方法,所以我的英語成績一直提升不上來

資料、雲端計算、人工智慧誰才有更好的發展?

雲端計算、大資料、人工智慧這三者的發展不能分開來講,三者是有著緊密聯絡的,互相聯絡,互相依託的,脫離了誰都不能更好的發展,讓我們具體來看一下! 一、大資料 大資料指無法在一定時間範圍內用常規軟體工具進行捕捉、管理和處理的資料集合,是需要新處理模式才能具有更強的決策力、洞察發現力和流程優化能力的海量、高增長

在5G、資料、AI領域進行合作商飛與騰訊雲共推飛機智慧製造

說到中國的大飛機制造,大家肯定會想到的一個名字:中國商飛~ 去年5月,中國首款國產大型商用飛機C919首飛成功,作為中國實施大型客機專案的主體,統籌幹線飛機和支線飛機發展、實現我國民用飛機產業化的主要載體,商飛也一下成了“網紅”。 飛機制造業被譽為工業領域的皇冠,是國家戰略性產業,商

基礎學習資料需要掌握的基礎

大資料已經成為時代發展的趨勢,很多人紛紛選擇學習大資料,想要進入大資料行業。大資料技術體系龐大,包括的知識較多,系統的學習大資料可以讓你全面掌握大資料技能。學習大資料需要掌握哪些知識?   1、學習大資料首先要學習Java基礎   怎樣進行大資料學習的快速入門?學大資料課程之前要先學習一種計算機程式

手機資料:窮人愛買iPhone華為使用者多有車有房

近日,知名調研機構MobData研究院公佈了中國2018年第三季的智慧手機市場調研報告。報告顯示,蘋果在手機市場佔有率依舊穩坐頭把交椅,高達21.6%,而華為小米OV等則緊隨其後。 有意思的是,MobData還詳盡地對各大手機品牌的使用者群體畫像進行刻畫分析。  

關於資料需要的java基礎

關於大資料需要的java基礎?     Java:大家都知道Java的方向有JavaSE、JavaEE、JavaME,學習大資料要學習那個方向呢?   只需要學習Java的標準版JavaSE就可以了,像Servlet、JSP、Tomcat

如何在未來的資料和AI機器學習領域獲得一份不錯的工作?

AI 的發展腳步會加快,這一年將是 AI 技術重生和資料科學得以重新定義的一年。對於雄心勃勃的資料科學家來說,他們如何在與資料科學相關的工作市場中脫穎而出?2018 年會有足夠多的資料科學相關工作嗎?還是說有可能出現萎縮?接下來,讓我們來分析一下資料科學的趨勢,並一探如何在未來的大資料和機器學習 /

一起來學資料|Spring的事務管理一分錢也不能少

  之前我們講過spring是一站式框架,我們已經學習了spring框架簡單的資料操作。今天我們一起來看看spring針對dao層提供的解決技術jdbcTemplate。我們直接以銀行轉賬為例,完成我們資料庫的連線和事務管理。 JdbcTemplate 1、準備工作

一起來學資料|Spring之AOP操作巧奪天功的切面技術

  我們已經看了Spring的註解,體驗了一把快速建立物件個屬性注入。一起來學大資料|秒懂Spring註解,艾特一下你就明白,這麼妙? 這篇我們學習的是spring中重要的AOP面向切面的思想。之後,我們便可以在不修改原始碼的前提下實現方法的增強。 AOP技術簡介

一起來學資料|秒懂Spring註解艾特一下你就明白這麼妙?

  我們已經簡單學習了spring框架和使用傳統的方式對類方法注入屬性。但是這樣的注入屬性方式,在當前看來還是比較的麻煩,那麼我們現在使用的更好的方式是什麼呢? 今天帶大家來看spring的bean管理下的註解方式,讓程式碼再精簡一半。 註解介紹 我們知道spri

一起來學資料|整合SpringMVC與Mybatis各司其職相得益彰

  我們在上篇的文章中學習了在網頁上展示一個簡單 的商品頁面,而我們真正需要的是與資料庫之間結合。 今天我們就一起來看看持久層最優秀的mybatis和控制層最優秀的spring最佳整合。 整合思路 Dao層: 1、SqlMapConfig.xml,這裡我們只需

資料學習】數學基礎及應用

一談到大資料技術,很多人首先想到的是數學,大概是因為數字在數學體系中穩固的位置吧,這也是理所當然的。大資料時代已經被抄的很熱了,這個行業目前已經逐漸成熟,想學習大資料開發的人越來越多。每天我們在網際網路都要存留大量的資訊,但如何收集、整理這海量的資訊,併產生價值,已經是各行各業都在探索的重要課題,且

想從事資料相關的高工資工作這樣的學習路線才是你需要的!

現在的大資料是很紅火的,薪資比通常的軟體行業要高,所以很多年輕人想進入這個行業。但並不是每個大資料相關的工作都是高薪的,主要還是根據自己的專長進行選擇發展。大資料涉及的知識很廣泛,如果要當全能選手,是非常艱難,一個人的精力也是有限的。進行細分選擇,然後專攻才是正道。要了解學習大資料,如果是程式設計師,其實進入

資料技術之 Linux 基礎

  一、Linux 入門概述 概述 Linux 核心最初只是由芬蘭人林納斯·託瓦茲(Linus Torvalds)在赫爾辛基大學上學時出於個人愛好而編寫的。 Linux 是一套免費使用和自由傳播的類 Unix 作業系統,是一個基於 P