首先,让我们先来熟悉一下两种防止头文件被重复引用的处理#pragma once和#ifndef的区别
????????http://www.voidcn.com/article/p-hwdpsafs-wx.html
????接下来,开始我们的主题 <大数运算>
????在平时生活中细心的你可能会发现,好多时候我们使用计算器时,总有一个显示的最大值,当计算超过这个值时就不能再计算了,那如果我们想要计算更大的数值要怎么办?
????本文通过C++编程实现 大数的加减乘除四则运算
????<思路与方法同样都在程序内部>
????这次通过标准的三个文件来实现声明<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++);
?/