高精度加法和乘法的c++实现

来源:互联网 发布:西门子840d宏程序编程 编辑:程序博客网 时间:2024/06/05 10:44

上一篇用c写了高精度加法的计算,总的来说,从底层写起的话,对于不是很繁琐的代码,面向过程还是比较方便的。但是当我打算计算高精度乘法的时候,发现计算过程要比加法麻烦的多,而且会反复用到一些函数的调用,而且这里面还会用到高精度加法的计算,于是果断放弃的c,采用c++。


这里,我写了一个类,名为megaData,就是指一个很大的数(不过这个单词好像是指大数据,完全不懂大数据是什么,反正就这么命名了)。


类视图如下:



.h文件:

#pragma once#include<iostream>#include<time.h>using namespace std;//数据倒序储存(输出的时候反序)class megaData{private:int * pmegaData;//指向数据的指针int length;//数据长度megaData operator*(int a);//"*"的重载(a是个位数)megaData extend(int Len, int move, megaData &a);public:megaData();megaData(int length);megaData(megaData&a);//拷贝构造megaData operator=(megaData&a);//"="的重载megaData operator+(megaData&a);//"+"的重载megaData operator*(megaData&a);//"*"的重载void print();//打印数据void printLenth();//打印数据长度~megaData();};


.cpp文件:

#include "megaData.h"megaData::megaData(){srand((unsigned)time(NULL));pmegaData = new int[100];for (int i = 0; i < 100; ++i) {pmegaData[i] = rand() % 10;}this->length = 100;}megaData::megaData(int length){pmegaData = new int[length];for (int i = 0; i < length; ++i) {pmegaData[i] = rand() % 10;}this->length = length;}megaData::megaData(megaData & a){pmegaData = new int[a.length];length = a.length;memcpy(pmegaData, a.pmegaData, sizeof(int)*length);}//"="的重载megaData megaData::operator=(megaData & a){delete(this->pmegaData);this->pmegaData = new int[a.length];this->length = a.length;for (int i = 0; i < a.length; ++i) {this->pmegaData[i] = a.pmegaData[i];}return *this;}//"+"的重载megaData megaData::operator+(megaData &a){int lenth_result;//结果的长度(开头可能会是0)if (this->length > a.length) lenth_result = this->length + 1;else lenth_result = a.length + 1;//通过一个判断来确定结果的长度int * a2 = new int[lenth_result];//a2***********int * b2 = new int[lenth_result];//b2***********memcpy(a2, a.pmegaData, sizeof(int)*a.length);memset(a2 + a.length, 0, sizeof(int)*(lenth_result - a.length));memcpy(b2, this->pmegaData, sizeof(int)*this->length);memset(b2 + this->length, 0, sizeof(int)*(lenth_result - this->length));int * result = new int[lenth_result];//result*********result[0] = a2[0] + b2[0];for (int i = 1; i < lenth_result - 1; ++i) {result[i] = a2[i] + b2[i] + result[i - 1] / 10;result[i - 1] = result[i - 1] % 10;}result[lenth_result - 1] = result[lenth_result - 2] / 10;result[lenth_result - 2] = result[lenth_result - 2] % 10;delete[] a2;delete[] b2;megaData result2(lenth_result);if (result[lenth_result - 1] == 0) {//如果结果的最大位是0(说明多了一位)delete[] result2.pmegaData;result2.pmegaData = new int[lenth_result - 1];memcpy(result2.pmegaData, result, sizeof(int)*(lenth_result - 1));result2.length = lenth_result - 1;}else {memcpy(result2.pmegaData, result, sizeof(int)*(lenth_result));}return result2;}//"*"的重载megaData megaData::operator*(megaData & a){int Len = this->length + a.length;megaData result = *this * a.pmegaData[a.length-1];result = extend(Len, a.length - 1, result);for (int i = a.length - 2; i >= 0; --i) {megaData tempresult = *this * a.pmegaData[i];tempresult = extend(Len, i, tempresult);result = tempresult + result;}if (result.pmegaData[result.length] == 0) {//如果结果的最大位是0(说明多了一位)result.length -= 1;}return result;}//"*"的重载(a是个位数)megaData megaData::operator*(int a){megaData result(this->length + 1);for (int j = 0; j < length + 1; ++j) {if (j == 0) {//第一位result.pmegaData[j] = a*this->pmegaData[j] % 10;}else if (j == length ) {//最后一位result.pmegaData[j] = a*this->pmegaData[j - 1] / 10 + result.pmegaData[j - 1] / 10;//把这一位在正常的计算结果基础上加result[j - 1] / 10result.pmegaData[j - 1] = result.pmegaData[j - 1] % 10;//把前一位变成之前的前一位除10取余}else {//中间的某一位result.pmegaData[j] = a*this->pmegaData[j - 1] / 10 + a*this->pmegaData[j] % 10 + result.pmegaData[j - 1] / 10;//把这一位在正常的计算结果基础上加result[j - 1] / 10result.pmegaData[j - 1] = result.pmegaData[j - 1] % 10;//把前一位变成之前的前一位取余数}}if (result.pmegaData[length] == 0) {//如果结果的最大位是0(说明多了一位)result.length -= 1;}return result;}//拓展并移动数据megaData megaData::extend(int Len, int n, megaData & a){megaData result(Len);memset(result.pmegaData, 0, sizeof(int)*Len);memcpy(result.pmegaData + n, a.pmegaData, sizeof(int)*a.length);return result;}//打印出数据void megaData::print(){for (int i = length-1; i >=0; --i)cout << pmegaData[i];cout << endl;}//打印数据长度void megaData::printLenth(){cout << length << endl;}megaData::~megaData(){delete[] pmegaData;}

测试main函数:

//authorsummer_awn//date2017/6/20#include"megaData.h"void main() {srand((unsigned)time(NULL));clock_t start, end;start = clock();megaData a(10000);cout << "a = ";//a.print();megaData b(3000);cout << "b = ";//b.print();megaData c = a + b;cout << "a + b = ";//c.print();megaData d = a * b;cout << "a * b =";//d.print();end = clock();float time = (float)(end - start) / 1000;cout << "time is:" << time << "s" << endl;system("pause");}

运行结果:



说实话,我今天是第一次写拷贝构造函数以及运算符的重载,,,,,,

很想知道我这一年都干啥了,,,,,

em。。。本篇文章非教程(因为我啥也没讲,代码也挺乱的),就当是记录我的学习过程了吧,


明天考大物,祈求不挂。。。


原创粉丝点击