现在的位置: 首页 > 综合 > 正文

大数运算之加减乘法

2012年09月17日 ⁄ 综合 ⁄ 共 3914字 ⁄ 字号 评论关闭

用string做了大数运算的加减乘法,不过除法暂时还没想到该怎么做。。。算是一个较大的模拟吧。*^◎^*大笑

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int  accurate=8; 
void trim(string & n)
{
	bool dot=false;
	unsigned int loc=n.find('.',0);
	if(loc!=string::npos)dot=true;

	if(dot)
	{
		int i=0;
		while(n.at(n.size()-1)=='0' )
			n.erase(n.size()-1,1);
		if(n.at(n.size()-1)=='.')
			n.erase(n.size()-1,1);
		if(n=="")n="0";
	}
	while(n.at(0)=='0' && n.size()>1)
		n.erase(0,1);
	if(n.at(0)=='.')n.insert(0,1,'0');
}
int FindDot(string &n)
{
	unsigned int flag=n.find('.',0);
	if(flag==string::npos)
		return 0;
	else 
		return n.size()-flag-1;
}
void homogeneous(string &n1,string &n2)
{
	bool has_dot=true;
	int flag1=FindDot(n1) , flag2=FindDot(n2);
	if(!flag1 && !flag2)has_dot=false;

	if(has_dot)
	{
		if(!flag1)
			n1.append(".");
		if(!flag2)
			n2.append(".");

		if(n1.size()-flag1<n2.size()-flag2)
			n1.insert(0,n2.size()-flag2+flag1-n1.size(),'0');
		else
			n2.insert(0,n1.size()-flag1+flag2-n2.size(),'0');

		if(flag1<flag2)
			n1.append(flag2-flag1,'0');
		else 
			n2.append(flag1-flag2,'0');		
	}
	else
	{
		if(n1.size()<n2.size())
			n1.insert(0,n2.size()-n1.size(),'0');
		else
			n2.insert(0,n1.size()-n2.size(),'0');
	}
}
string Addition(string n1,string n2)
{
	trim(n1);
	trim(n2);
	homogeneous(n1,n2);

	bool carry=false;
	int i=0;
	for(i=0;i<n1.size();++i)
	{
		if(n1.at(n1.size()-i-1)=='.')continue;
		int temp=n1.at(n1.size()-i-1)-'0'+n2.at(n2.size()-i-1)-'0'+carry;
		if(temp>=10)
		{
			temp-=10;
			carry=true;
		}
		else carry=false;
		n1.at(n1.size()-i-1)=temp+'0';
	}
	if(carry)n1.insert(0,1,'1');

	trim(n1);
	return n1;
}
bool compare(string n1,string n2)
{
	for(int i=0;i<n1.size();++i)
	{
		if(n1.at(i)<n2.at(i))return true;
		else return false;
	}
}
void sub_carry(string &n,int i,int temp)
{
	if(temp<0)
	{
		int token=i+1;
		for(;token<n.size();++token)
		{
			if(n.at(n.size()-token-1)=='.')continue;
			temp=n.at(n.size()-token-1)-'0'-1;
			if(temp>=0)n.at(n.size()-token-1)=temp+'0';
			else 
			{
				n.at(n.size()-token-1)='9';
				sub_carry(n,token,temp);
			}
			return;
		}
	}
}
string Subtraction(string n1,string n2)
{
	trim(n1);
	trim(n2);
	homogeneous(n1,n2);

	bool negative=false;
	if(compare(n1,n2))
	{
		negative=true;
		string temp=n1;
		n1=n2;
		n2=temp;
	}
	int i=0;
	bool carry=false;
	for(i=0;i<n1.size();++i)
	{
		if(n1.at(n1.size()-i-1)=='.')continue;
		int temp=n1.at(n1.size()-i-1)-n2.at(n2.size()-i-1);
		if(temp<0) 
		{
			sub_carry(n1,i,temp);
			temp+=10;
		}
		 n1.at(n1.size()-i-1)=temp+'0';
	}
	if(negative) n1.insert(0,1,'-');
	trim(n1);
	return n1;
}
string Multiplication(string n1,string n2)
{
	trim(n1);
	trim(n2);
	if(n1.size()<n2.size())
	{
		string temp=n1;
		n1=n2;
		n2=temp;
	}

	int flag1=n1.find('.',0),flag2=n2.find('.',0);
	int f1,f2;
	if(flag1==string::npos)flag1=0,f1=0;
	else
	{
		n1.erase(flag1,1);
		f1=n1.size()-flag1;
	}
	if(flag2==string::npos)flag2=0,f2=0;
	else
	{
		n2.erase(flag2,1);
		f2=n2.size()-flag2;
	}
	
	string ans="0";
	for(int i=0;i<n2.size();++i)
	{
		int carry=0;
		string t="";
		for(int j=0;j<n1.size();++j)
		{
			int temp=(n2.at(n2.size()-1-i)-'0')*(n1.at(n1.size()-1-j)-'0')+carry;
			carry=0;
			while (temp>=10)
			{
				temp-=10;
				++carry;
			}
			t.insert(0,1,temp+'0');
		}
		if(carry)
		{
			t.insert(0,1,carry+'0');
		}
		for(int num=0;num<i;++num)
			t.append(1,'0');
		ans=Addition(ans,t);
	}
	if(ans!="0")
		ans.insert(ans.size()-f1-f2,1,'.');
	trim(ans);
	return ans;
}
string Divide(string n1,string n2)
{
	trim(n1);
	trim(n2);

	unsigned int flag1=n1.find('.',0),flag2=n2.find('.',0);
	int f=0;
	if(flag2==string::npos)flag2=0;
	else 
	{
		n2.erase(flag2,1);
		f+=n2.size()-flag2-1;
	}
	if(flag1==string::npos)flag1=0;
	else
	{
		n1.erase(flag1,1);
		f+=n1.size()-flag1-1;
	}
	while(compare(n1,n2))
	{
		n1.append("0");
		--f;
	}


	string ans="0";
	int postition=0;
	for(int i=0;i<n2.size();++i)
	{
		int carry=0,temp=0,reminder=0,pos=0;
		string res="";
		bool dot=false;
		for(int j=0;j<n1.size();++j)
		{
			if(carry)
			{
				temp*=10;
			}
			temp+=n1.at(j)-'0'+reminder*10;
			
			if(temp<n2.at(i)-'0' && temp>0)
			{
				++carry;
				continue;
			}
			carry=0;
			reminder=temp%(n2.at(i)-'0');
			res.append(1,temp/(n2.at(i)-'0')+'0');
			temp=0;
		}

		
		if(reminder)
		{
			res.append(1,'.');
			for(int t=0;t<=accurate;++t)
			{
				if(reminder==0)break;
				int temp=reminder*10;
				res.append(1,temp/(n2.at(i)-'0'));
				reminder=temp%(n2.at(i)-'0');
			}
		}
		ans=Addition(ans,res);
	}

	return ans;
}
int main()
{
	string n1,n2;
	while(cin>>n1>>n2)
	{
		cout<<Addition(n1,n2)<<endl;
		cout<<Subtraction(n1,n2)<<endl;
		cout<<Multiplication(n1,n2)<<endl;
//		cout<<Divide(n1,n2)<<endl;
	}
	return 0;
}

抱歉!评论已关闭.