站长网 大数据 大数运算实现加减乘除四则运算

大数运算实现加减乘除四则运算

首先,让我们先来熟悉一下两种防止头文件被重复引用的处理#pragma once和#ifndef的区别 ????????http://www.voidcn.com/article/p-hwdpsafs-wx.html ????接下来,开始我们的主题 大数运算 ????在平时生活中细心的你可能会发现,好多时候我们使用计算器时,

首先,让我们先来熟悉一下两种防止头文件被重复引用的处理#pragma once和#ifndef的区别

????????http://www.voidcn.com/article/p-hwdpsafs-wx.html

????接下来,开始我们的主题 <大数运算>
????在平时生活中细心的你可能会发现,好多时候我们使用计算器时,总有一个显示的最大值,当计算超过这个值时就不能再计算了,那如果我们想要计算更大的数值要怎么办?

wKiom1cEn5SCORz_AADVcMQzbig698.jpg

????本文通过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++);
?/

本文来自网络,不代表站长网立场,转载请注明出处:https://www.zwzz.com.cn/html/shuju/2021/0526/6836.html

作者: dawei

【声明】:站长网内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。
联系我们

联系我们

0577-28828765

在线咨询: QQ交谈

邮箱: xwei067@foxmail.com

工作时间:周一至周五,9:00-17:30,节假日休息

返回顶部