la aritmética de alta precisión

La magia de la aritmética de alta precisión

Después de todo, es más memorables gracias a pura cerebro hoyos Mano

#ifndef HUGEINTEGER_H
#define HUGEINTEGER_H
#include<iostream>
using namespace std;
class HugeInteger{
public:
	HugeInteger();
	friend ostream & operator<<(ostream &,const HugeInteger& );
	void input(char*);
	HugeInteger operator+(const HugeInteger& );
	HugeInteger operator*(const HugeInteger& );
	HugeInteger operator-(const HugeInteger& );
	HugeInteger operator/(const HugeInteger& );
	bool operator!=(const HugeInteger& );
	bool operator>=(const HugeInteger& );
	bool operator<=(const HugeInteger& );
	bool operator==(const HugeInteger& );
	bool operator<(const HugeInteger& );
	bool operator>(const HugeInteger& );
//	~HugeInteger();
private:
	int integer[100];
};
#endif
#include<iostream>
#include"HugeInteger.h"
using namespace std;
HugeInteger::HugeInteger(){for(int i=0;i<100;i++)integer[i]=0;}

void HugeInteger::input(char*ch)
{
	int t=0;
	while(*(ch+t)!='\0')t++;t--;
	for(int i=0;i<=t;i++)integer[i]=*(ch+t-i)-'0';
}

bool HugeInteger::operator>(const HugeInteger& integer1)
{
	for(int i=99;i>=0;i--)
	{
		if(integer[i]<integer1.integer[i])return 0;
		if(integer[i]>integer1.integer[i])return 1;
	}
	return 1;
}

bool HugeInteger::operator==(const HugeInteger& integer1)
{
	for(int i=99;i>=0;i--)
	{
		if(integer[i]!=integer1.integer[i])return 0;
	}
	return 1;
}

bool HugeInteger::operator<(const HugeInteger& integer1)
{
	if((*this>integer1)||(*this==integer1))return 0;
	return 1;
}

bool HugeInteger::operator!=(const HugeInteger& integer1)
{
	return !(*this==integer1);
}

HugeInteger HugeInteger::operator+(const HugeInteger& integer2)
{
	HugeInteger answer1;int t,c;
	for(int i=0;i<99;i++)
	{
		t=answer1.integer[i]+integer[i]+integer2.integer[i];
		c=t%10;t/=10;
		answer1.integer[i]=c;answer1.integer[i+1]=t;
	}
	answer1.integer[99]+=integer2.integer[99]+integer[99];
	return answer1;
}

HugeInteger HugeInteger::operator-(const HugeInteger& integer2)
{
	HugeInteger answer,tmp;
	for(int i=0;i<99;i++)
	{
		answer.integer[i]+=integer[i]-integer2.integer[i];
		if(answer.integer[i]<0)answer.integer[i]+=10,answer.integer[i+1]-=1;
	}
	answer.integer[99]+=(integer[99]-integer2.integer[99]);
	return answer;
}

HugeInteger HugeInteger::operator*(const HugeInteger& integer2)
{
	HugeInteger answer;
	int i=99,j=99;
	while(!integer[i])i--;
	while(!integer2.integer[j])j--;
	for(int k=0;k<=j;k++)
	{
		if(!integer2.integer[k])continue;
		HugeInteger tmp1,tmp2;int t=0,c=0;
		for(int m=i;m>=0;m--)tmp1.integer[m+k]=integer[m];
		for(int m=k;m<=k+i;m++)
		{
			t=tmp1.integer[m]*integer2.integer[k];
			c=t%10;t/=10;
			tmp2.integer[m]+=c;tmp2.integer[m+1]+=t;
		}
		answer=answer+tmp2;
	}
	return answer;
}

HugeInteger HugeInteger::operator/(const HugeInteger& integer1)
{
	HugeInteger answer,tmp1;
	tmp1=*this;
	int i=99,j=99;
	while(!integer1.integer[j])j--;
	while(tmp1>integer1)
	{
		HugeInteger tmp2;
		int k;
		while(!tmp1.integer[i])i--;
		k=i-j;
		if(tmp1.integer[i]<integer1.integer[j])k--;
		int t=0;
		for(int f=k;f<=i;f++)
			tmp2.integer[t++]=tmp1.integer[f];
		int ans=0;
		while(tmp2>integer1)
		{
			ans++;
			tmp2=tmp2-integer1;
		}
		t=0;
		for(int f=k;f<=i;f++)tmp1.integer[f]=tmp2.integer[t++];
		answer.integer[k]=ans;
	}
	return answer;
}

ostream & operator<<(ostream & co,const HugeInteger& integer1)
{
	int i=99;
	while(!integer1.integer[i])i--;
	while(i>-1){co<<integer1.integer[i];i--;}
	co<<endl;
	return co;
}
#include<iostream>
#include"HugeInteger.h"
#include<cstdio>
using namespace std;
int main()
{
	char ch1[100],ch2[100],f;
	while(1)
	{
		HugeInteger integer1,integer2,answer;
		cout<<"@ to end"<<endl;
		cin>>ch1;if(ch1[0]=='@')break;
		cin>>f;
		cin>>ch2;
		integer1.input(ch1);integer2.input(ch2);
		if(f=='+')answer=integer1+integer2;
		else if(f=='-')answer=integer1-integer2;
		else if(f=='*')answer=integer1*integer2;
		else if(f=='/')answer=integer1/integer2;
		cout<<"="<<answer<<endl;
		if(integer1==integer2)cout<<"integer1 is equal to integer2"<<endl;
		if(integer1!=integer2)cout<<"integer1 is not equal to integer2"<<endl;
		if(integer1<integer2)cout<<"integer1 is less than integer2"<<endl;
		if(integer1>integer2)cout<<"integer1 is larger than integer2"<<endl;
		cout<<endl;
	}
	
	system("pause");
	return 0;
}
Publicado 20 artículos originales · ganado elogios 1 · vistas 6318

Supongo que te gusta

Origin blog.csdn.net/yichengchangan/article/details/105060346
Recomendado
Clasificación