大数运算实现加减乘除四则运算
发布时间:2021-05-28 05:51:45 所属栏目:大数据 来源:网络整理
导读:首先,让我们先来熟悉一下两种防止头文件被重复引用的处理#pragma once和#ifndef的区别 ????????http://www.voidcn.com/article/p-hwdpsafs-wx.html ????接下来,开始我们的主题 大数运算 ????在平时生活中细心的你可能会发现,好多时候我们使用计算器时,
首先,让我们先来熟悉一下两种防止头文件被重复引用的处理#pragma once和#ifndef的区别 ????????http://www.voidcn.com/article/p-hwdpsafs-wx.html ????接下来,开始我们的主题 <大数运算>
????<思路与方法同样都在程序内部> ????这次通过标准的三个文件来实现声明<BIGDATA.h>、定义实现函数功能<BIGDATA.cpp>、测试<test.cpp> <BIGDATA.h> #pragma?once #ifndef?__BIGDATA_H__ #define?__BIGDATA_H__ #define?_CRT_SECURE_NO_WARNINGS?1 #include<iostream> using?namespace?std; #include<string.h> #include<assert.h> //1、考虑当数值小时,运算速度尽量贴近内置类型(所以,结构会有两个-->内置类型long?long?及大数的?char*) //2、构造时可能的输入{"1234"?"0001234"??"1564adf"??"???"??"+(-)12345"?} // typedef?long?long?INT64; //string?MAX_INT64?=?"9223372036854775807"; //string?MIN_INT64?=?"-9223372036854775808"; //enum{?MAX_INT64?=?9223372036854775807,?MIN_INT64?=?-9223372036854775808?};//不行enum后是int类型 // const?INT64?MAX_INT64?=?0x7fffffffffffffff;//?9223372036854775807; const?INT64?MIN_INT64?=?0x8000000000000000;//-9223372036854775808; class?BigData { public: ?BigData(INT64?value?=?0); ?BigData(const?string?pData); ?BigData?operator+(const?BigData?bigdata); ?BigData?operator-(const?BigData?bigdata); ?BigData?operator*(const?BigData?bigdata); ?BigData?operator/(const?BigData?bigdata); ?~BigData(); ?void?Print(); private: ?bool?PDataIsOverINT64()const; ?friend?std::ostream&operator<<(std::ostream&?_cout,?const?BigData&?bigdata);//不能在_cout前加const???->_cout<<10<<endl;将不能通过 ? ?BigData?Add(string?pData1,?string?pData2);//并不一定要写成成员函数?(也可以写成一般函数被使用) ?BigData?Sub(string?pData1,?string?pData2); ?BigData?Mul(string?pData1,?string?pData2); ?BigData?Div(string?pData1,?string?pData2); private: ?INT64?_value; ?string?_pData; }; #endif?__BIGDATA_H__ //<BIGDATA.cpp> #include"BIGDATA.h" BigData::BigData(INT64?value)//若输入的数值位数大于MAX_DATA,系统编译不通过,当位数一致且大于时,转为负,无能为力 ?:_value(value) { ?//在_pData中加入value ?void?Invert(string&?pdata); ?size_t?i?=?0; ?INT64?tmp?=?0; ?_pData.append(1,?'+'); ?if?(value?<?0) ?{ ??_pData[0]?=?'-'; ??value?*=?-1; ?} ?while?(value?!=?0) ?{ ??tmp?=?value?%?10; ??_pData.append(1,?(char)(tmp?+?'0')); ??value?/=?10; ?} ?Invert(_pData); } BigData::BigData(const?string??pData) { ?//解决各种特殊情况 ?//{"1234"?"0001234"??"1564adf"??"???"??"+(-)12345"?NULL?} ?//参考atoi()函数处理办法 ? ?//跳过符号将输入字符串都归为一般 //??//判是否是数字字符isdigit(int?c)是-1/否0??还有判空字符(宏定义)?isspace(int?c)??头文件<ctype.h> ?char*?tmp?=?(char*)&pData[0]; ?_pData.append(1,?'+');??//添加符号(默认为'+') ?if?((*tmp?<?'0'?||?*tmp?>?'9')?&&?*tmp?!=?'?'&&?*tmp?!=?'+'&&?*tmp?!=?'-'&&?*tmp?!=?'t')??//排除其他符号 ?{ ??//cout?<<?"false"?<<?endl; ??_pData.append(1,?'0'); ??_value?=?0; ??return; ?} ?while(isspace(*tmp))?//while?(*tmp=='?')???//消除前面的空格(tab) ?{ ??tmp++; ?} ?if?(*tmp?==?'+'?||?*tmp?==?'-')??//跳过符号/修正符号 ?{ ??if?(*tmp?==?'-') ??{ ???_pData[0]?=?'-'; ??} ??tmp++; ?} ?while?(*tmp?==?'0')???//消除前面的0(必须先消除空格,再消除0,最后判断+(-)) ?{ ??tmp++; ?} //********************* ?//一个一个追加效率不高-->转化为一次开辟 ?//while(isdigit(*tmp))??//while?(*tmp?>=?'0'&&?*tmp?<=?'9') ?//{ ?//?_pData.append(1,?*tmp++); ?/ |