【C++】大数的+-*/四则运算
所谓大数,则指数值特别大的数,可能会有99位,100位,远远超过了long long表示的范围。
这样的数作四则运算,需要用到字符串。用字符串通过每一位的字符的四则运算来模拟。
废话少说,上代码:
#include <iostream>
#include <vector>
using namespace std; class BigNum{
vector<char> m_vec;
//构造函数,析构函数,size()函数,友元重载>>,<<,重载[] + - * / =。
public:
BigNum();
~BigNum(); public:
int size() const {
return m_vec.size();
}
void clr(){
m_vec.clear();
} public:
friend ostream& operator<<(ostream &os,const BigNum &data);
friend istream& operator>>(istream &is,BigNum &data); public:
char operator[](int nIndex) const; BigNum operator+(const BigNum &data);
BigNum operator-(BigNum &data);
BigNum operator*(const BigNum &data);
BigNum operator/(BigNum &data);
BigNum& operator=(const BigNum &data);
bool operator==(const BigNum &data);
bool operator>(const BigNum &data);
bool operator>=(const BigNum &data);
}; BigNum::BigNum(){} BigNum::~BigNum(){} ostream& operator<<(ostream &os,const BigNum &data){
vector<char>::const_iterator itVec = data.m_vec.begin();
for(; itVec != data.m_vec.end(); itVec++){
os << *itVec;
}
os << endl;
return os;
} istream& operator>>(istream &is,BigNum &data){
//必须清空is的缓冲区,不然is.get()得到的是上一次回车的\n。并且不能用is.ignore(),因为ignore()会把第一次输入的第一个字符删除掉。
is.sync();
while(true){
char c = is.get();
if(' ' == c || '\r' == c || '\n' == c)
break;
if( c < '' || c > ''){
data.m_vec.clear();
cerr << "not accept" << endl;
break;
}
data.m_vec.push_back(c);
} return is;
} char BigNum::operator[](int nIndex) const
{
if(nIndex < || nIndex >= m_vec.size())
{
cerr << "error occur in []";
return ' ';
}
return m_vec[nIndex];
} bool BigNum::operator==(const BigNum &data){
if(m_vec.size() != data.m_vec.size())
return false;
for(int i = ; i < m_vec.size(); i++){
if(m_vec[i] != data.m_vec[i])
return false;
}
return true;
} bool BigNum::operator>(const BigNum &data){
int a = m_vec.size();
int b = data.m_vec.size();
if(a > b){
return true;
}
else if(a < b){
return false;
}
else if(a == b)
{
for(int i = ; i < a; i++){
if(m_vec[i] > data.m_vec[i]){
return true;
}
else if(m_vec[i] < data.m_vec[i]){
return false;
}
}
return false;
}
} bool BigNum::operator>=(const BigNum &data){
if(*this > data || *this == data)
return true;
return false;
} BigNum BigNum::operator+ (const BigNum &data){
int nCarry = ;
BigNum numTemp;
vector<char>& vecTemp = numTemp.m_vec; //必须是引用 int i = data.size() - ;
int j = m_vec.size() -;
for(; i >= || j >= ; i--,j--){
char a = j>=? m_vec[j] - '': ;
char b = i>=? data[i] - '' :;
char c = a + b + nCarry;
nCarry = c / ;
vecTemp.push_back(c% + '');
} if(nCarry != )
{
vecTemp.push_back(nCarry + '');
} //reverse vecTemp
for(i = , j = vecTemp.size() - ; i < j; i++,j--)
{
char cTemp = vecTemp[i];
vecTemp[i] = vecTemp[j];
vecTemp[j] = cTemp;
}
return numTemp;
} BigNum& BigNum::operator=(const BigNum &data)
{
m_vec.clear();
vector<char>::const_iterator itVec = data.m_vec.begin();
for(; itVec != data.m_vec.end(); itVec++)
{
m_vec.push_back(*itVec);
}
return *this;
} BigNum BigNum::operator*(const BigNum &data){
int nCarry = ;
BigNum result;
BigNum numTemp;
vector<char>& vecTemp = numTemp.m_vec; int i = data.size()-;
for(; i >= ; i--){
char a = data[i] - '';
int j = m_vec.size() - ;
for(; j >= ; j--){
char b = m_vec[j] - '';
char c = b * a + nCarry;
nCarry = c/;
vecTemp.push_back(c % + '');
}
if(nCarry != ){
vecTemp.push_back(nCarry + '');
nCarry = ;
} //reverse vecTemp
int n = ;
int m = vecTemp.size() - ;
for(; n < m; n++,m--){
char cTemp = vecTemp[n];
vecTemp[n] = vecTemp[m];
vecTemp[m] = cTemp;
} for(int t = data.size() - ; t > i; t--)
{
vecTemp.push_back('');
} result = result + numTemp;
vecTemp.clear();
}
return result;
} BigNum BigNum::operator-(BigNum &data){
//m_vec > data.m_vec
int nCarry = ;
BigNum numTemp;
vector<char>& vecTemp = numTemp.m_vec; int i = data.size() - ;
int j = m_vec.size() -;
for(; i >= || j >= ; i--,j--){
char a = j>=? m_vec[j] - '': ;
char b = i>=? data[i] - '' :;
char c = a - nCarry;
if(c < b){
//需要借位
c = c + ;
nCarry = ;
vecTemp.push_back( (c-b) + '');
}
else{
nCarry = ;
vecTemp.push_back( (c-b) + '');
}
} //记录前面产生几个0
int zero = ;
vector<char>::const_iterator itVec = vecTemp.end()-;
for(; ; itVec--){
if( *itVec == ''){
zero++;
}
else
break;
if(itVec == vecTemp.begin())
break;
} //pop掉0
for(int k = zero; k > ; k--)
vecTemp.pop_back(); //reverse
for(i = , j = vecTemp.size() - ; i < j; i++,j--)
{
char cTemp = vecTemp[i];
vecTemp[i] = vecTemp[j];
vecTemp[j] = cTemp;
} return numTemp;
} BigNum BigNum::operator/(BigNum &data){
//m_vec > data.m_vec
BigNum numTemp;
vector<char>& vecTemp = numTemp.m_vec;
BigNum &numThis = *this; int lenA = m_vec.size();
int lenB = data.m_vec.size();
for (int i = lenB; i < lenA; i++){
data.m_vec.push_back('');
}
for(int j = lenB; j <= lenA; j++){
int a = ;
while(numThis >= data){
numThis = numThis - data;
a++;
}
vecTemp.push_back( a + '');
data.m_vec.pop_back();
}
return numTemp;
} int main()
{
BigNum numA;
BigNum numB;
BigNum numC;
char opt;
while(){
cin >> numA;
cin >> opt;
cin >> numB; switch(opt){
case '+':
numC = numA + numB;
cout << numC;
break;
case '-':
if(numA == numB){
cout << << endl;
}
else if(numA > numB){
numC = numA - numB;
cout << numC;
}
else{
numC = numB - numA;
cout << '-';
cout << numC;
}
break;
case '*':
numC = numA * numB;
cout << numC;
break;
case '/':
if(numA == numB){
cout << << endl;
}
else if(numA > numB){
numC = numA / numB;
cout << numC;
}
else{
cout << << endl;
}
break;
}
//清空numA,numB。
numA.clr();
numB.clr();
numC.clr();
}
return ;
}
【C++】大数的+-*/四则运算的更多相关文章
- 大数四则运算java(转)
// 大数的四则运算 #include <iostream> #include <string> #include <algorithm> using namesp ...
- JAVA大数的一些操作
参考: https://www.cnblogs.com/tonyyy/p/10433460.html https://www.cnblogs.com/wkfvawl/p/9377441.html (d ...
- node操作MongoDB数据库之插入
在上一篇中我们介绍了MongoDB的安装与配置,接下来的我们来看看在node中怎样操作MongoDB数据库. 在操作数据库之前,首先应该像关系型数据库一样建个数据库把... 启动数据库 利用命令提示符 ...
- temporary
private void OnAttendeeConnected(object pObjAttendee) { IRDPSRAPIAttendee pAttendee = pObjAttendee a ...
- C语言实现大数四则运算
一.简介 众所周知,C语言中INT类型是有限制,不能进行超过其范围的运算,而如果采用float类型进行运算,由于float在内存中特殊的存储形式,又失去了计算的进度.要解决整个问题,一种解决方法是通过 ...
- 大数四则运算之加法运算--------C语言版(未考虑负数)
/* 声明两个字符数组,用于存储大数,声明两个整数型数组便于计算,将字符数组中的元素转换为对应整数存于整数数组中,将低位放在整数数组低位,便于对齐计算 判断是否有进位,计算结果高位先输出,从数组后往前 ...
- 大数四则运算之减法运算-----c语言版
/* 分三种情况: 1.减数长度大于被减数 交换减数与被减数,输出负号,方便减 2.减数长度等于被减数(分三种情况) a.减数大于被减数,类似1情况1 b.减数等于被减数,两数相等,直接输出0,完成. ...
- 支持无限精度无限大数的类BigNumber实现
介绍 本篇是MathAssist的第二篇,在前言中粗略地展示了MathAssist的“计算和证明”能力,本篇开始将详细介绍其实现原理. 从计算开始说起,要实现任意大数的计算器首先得有一个类支持大数运算 ...
- Java的大数操作分为BigInteger和BigDecimal
Java的大数操作分为BigInteger和BigDecimal,但这两给类是分开使用的,有时候在编程的时候显得略微繁琐,现在编写了一个将二者合二为一的大数操作类. 大数操作类代码如下: 1 pack ...
随机推荐
- 转:SVN Eclipse插件Subclipse安装和配置
一.安装Subclipse subclipse项目地址:http://subclipse.tigris.org/. 安装Subclipse的最好方法是使用Eclipse Update Manager. ...
- MATLAB三维曲面
今天终于测试了,发下来第一张试卷中只会做一小题.我蒙了!!! 所以呢,我现在再做一下,总结总结! 作函数 f(x)=2(x1-1)4+2x22 的三维图. 这道题要用到的知识点有函数meshgrid. ...
- linux 有名管道(FIFO)
http://blog.csdn.net/firefoxbug/article/details/8137762 linux 有名管道(FIFO) 管道的缓冲区是有限的(管道制存在于内存中,在管道创建时 ...
- hdu 1078 FatMouse and Cheese 记忆化dp
只能横向或竖向走...一次横着竖着最多k步...不能转弯的.... 为毛我的500+ms才跑出来... #include<cstdio> #include<iostream> ...
- MySQL5.6 windows7下安装及基本操作
图形界面安装MySQL5.6关于图形界面的安装,网上相关相关资料比较多,此处省略安装过程.安装过程中选择安装路径.所需组件及root账号密码.1.目前针对不同用户,MySQL提供了2个不同的版本:My ...
- CSS学习笔记——盒模型,块级元素和行内元素的区别和特性
今天本来打算根据自己的计划进行前端自动化的学习的,无奈早上接到一个任务需求需要新增一个页面.自从因为工作需要转前端之后,自己的主要注意力几 乎都放在JavaScript上面了,对CSS和HTML这方面 ...
- linq读书笔记2-查询内存中的对象
上次我们说到了linq对数组内容的检索,自.net2.0以后,泛型成了很常见的一种应用技术,linq对泛型的检索也提供了完善的支持 如对list类型的支持,范例如下: class Program ...
- android如何调用显示和隐藏系统默认的输入法(一)
1.调用显示系统默认的输入法 方法一. InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_MET ...
- 详解AJAX核心 —— XMLHttpRequest 对象 (上)
我要说的内容都是非常基础的内容,高手就免看了,如果看了欢迎给点意见啊.新手或者对低层还不是很了解的人可以看看,帮助理解与记忆. XMLHttpRequest 对象是AJAX功能的核心,要开发AJAX程 ...
- 【转载自友盟消息推送iOS文档】在appDelegate中注册推送
1.2 基本功能集成指南 提示 请先在友盟的消息推送管理后台中创建App,获得AppKey和AppSecret 导入SDK 下载 UMessage_Sdk_All_x.x.x.zip并解压缩 导入 ...