加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

大数 加法,乘法,减法(c++类实现)

发布时间:2020-12-14 04:05:45 所属栏目:大数据 来源:网络整理
导读:闲来无事,练练c++!(有待完善,还少除法) #include iostream#include string#include cstring#include cstdlib#include cmathusing namespace std;const int INF=1e4;class BignNum{public://--------------------构造函数BignNum(){ memset(num,sizeof(num

闲来无事,练练c++!(有待完善,还少除法)

#include <iostream>
#include <string>
#include <cstring>
#include <cstdlib>
#include <cmath>
using namespace std;

const int INF=1e4;

class BignNum
{
public:
//--------------------构造函数
	BignNum(){ memset(num,sizeof(num)); len=1; }
	BignNum(int number){ *this=number; }
	BignNum(char *number){ *this=number; }

//-------------------重载 "=" 运算符
	BignNum operator =(const char *number)
	{
		len=strlen(number);
		for(int i=0;i<len;i++)
			num[i]=number[len-1-i]-'0';
		return *this;
	}
	BignNum operator =(int number)
	{
		char temp[INF];
		sprintf(temp,"%d",number);
		*this=temp;
		return *this;
	}

	string str() const;   //将计算结果转换成字符串


	BignNum operator + (const BignNum& x)const;  //加法运算
	BignNum operator - (const BignNum& x)const;  //减法运算
	BignNum operator * (const BignNum& x)const;  //乘法运算

private:
	int len;   //要计算的数据的长度
	int num[INF];  //保存要计算的数据
};

string BignNum::str()const
{
	string res="";
	for(int i=0;i<len;i++)
		res=char(num[i]+'0')+res;
	if(res == "") res="0";
	else        //除去前导0
	{
		int i;
		for(i=0;i<len-1;i++)
			if(res[i]!='0') break;  
		res=res.substr(i,len-i);
	}
	return res;
}


BignNum BignNum::operator - (const BignNum& x)const
{
	BignNum temp;
	temp.len=0;
	for(int i=0,g=0;i<len;i++)
	{
		if(i>=x.len)
		{
			temp.num[temp.len++]=num[i]-g;
			g=0;
			continue;
		}
		if(num[i]-g<x.num[i])
		{
			temp.num[temp.len++]=num[i]+10-x.num[i]-g;
			g=1;
		}
		else 
		{
			temp.num[temp.len++]=num[i]-x.num[i]-g;
			g=0;
		}
	}
	return temp;
}

BignNum BignNum::operator + (const BignNum& x)const
{
	BignNum temp;
	temp.len=0;
	for(int i=0,g=0;g||i<max(len,x.len);i++)
	{
		int b=g;
		if(i<len) b+=num[i];
		if(i<x.len) b+=x.num[i];
		temp.num[temp.len++]=b%10;
		g=b/10;
	}
	return temp;
}

BignNum BignNum::operator * (const BignNum& x)const
{
	BignNum temp;
	temp.len=len+x.len-1;
	for(int i=0;i<len ;i++)
	{
		int g(0);
		for(int j=0;j<x.len;j++)
		{
			temp.num[i+j]+=num[i]*x.num[j]+g;
			if(j!=x.len-1)
			{
				g=temp.num[i+j]/10;
				temp.num[i+j]=temp.num[i+j]%10;
			}
		}
	}
	if(temp.num[temp.len-1]>9)
	{
		int number=temp.num[temp.len-1]/10;
		temp.num[temp.len-1]=temp.num[temp.len-1]%10;
		temp.num[temp.len]=number;
		temp.len++;
	}
	return temp;
}


//----------重载 "<<" ">>" 运算符
istream& operator >> (istream& in,BignNum& x)
{
	string s;
	in>>s;
	x=s.c_str();
	return in;
}

ostream& operator << (ostream& out,BignNum& x)
{
	out<<x.str()<<endl;
	return out;
}


int swap(char *str1,char *str2)    //比较相减的两个字符串的大小
{
	int len1=strlen(str1);
	int len2=strlen(str2);
	if(len1<len2)
		return -1;
	else if(len1 == len2)
	{
		if(strcmp(str1,str2)==0) 
			return 0;
		if(strcmp(str1,str2)<0)
			return -1;
	}
	return 1;
}


int main()
{
	int ncase;
	cin>>ncase;
	while(ncase--)
	{
		char str1[500],str2[500];
		scanf("%s%s",str1,str2);
		int flag=swap(str1,str2);
		if(flag==0) cout<<"0"<<endl;
		else if(flag==-1)
		{
			BignNum Instance1(str2),Instance2(str1),temp;
			temp=Instance1-Instance2;
			cout<<"Instance1-Instance2=-"<<temp<<endl;
		}
		else
		{
			BignNum Instance1(str1),Instance2(str2),temp;
			temp=Instance1-Instance2;
			cout<<"Instance1-Instance2="<<temp<<endl;
		}

		char str3[500],str4[500];  
        BignNum Instance3,Instance4,temp1;  
        cin>>Instance3>>Instance4;  
        temp1=Instance3+Instance4;  
        cout<<"Instance3+Instance4="<<temp1<<endl;  
  
        temp1=Instance3*Instance4;  
        cout<<"Instance3*Instance4="<<temp1<<endl;  
	}
	return 0;
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读