登录 注册

bigmath

收藏
[C++] 标签: 2013-05-04 00:05
原始代码 全屏查看 0评 / 0藏 / 5928阅  跳至 / 234行
#include<iostream>
#include<string.h>
const int N=1001;
using namespace std;

typedef struct DATA{
	int num[N];
	int sign;
	int len;
}DATA;

//将输入的char型大数数组 转化 为int型大数数组
DATA chartoint(DATA &data,char *str)
{
	memset(data.num, 0, sizeof(data.num));//要把大于data.len的那些位置0。。
	data.len=strlen(str);
	for(int i=0;i<data.len;i++)
		data.num[i]=(int)str[i]-'0';
	return data;
}

//data成员的初始化 同时 将data.num[] chartoint
void initialise(DATA &data,char* str)
{
	//对sign赋值,并去符号
	if(str[0]=='-')
	{  
		data.sign=-1;  
		int len=strlen(str);
		for( int i=0; i<len-1; i++)
			str[i]=str[i+1];
		str[len-1]='\0';
	}
	else data.sign=1;
	chartoint(data,str);

}

//翻转大数
DATA turnstr(DATA &data)
{
	int t;
	int midlen=data.len/2;
	int lastnum=data.len-1;
	for(int i=0;i<midlen;i++)
	{
		t=data.num[i];
		data.num[i]=data.num[lastnum];
		data.num[lastnum]=t;
		lastnum--;
	}
	return data;
}

//比较两个大数绝对值的大小
int max(DATA data1,DATA data2)
{
	if(data1.len>data2.len) return 1;
	if(data1.len<data2.len) return 2;
	else
	{
		for(int i=0;i<data1.len;i++)
		{
			if(data1.num[i]>data2.num[i]) { return 1;}
			if(data1.num[i]<data2.num[i]) { return 2;}
		}
		return 0;
	}
}

//符号运算,只处理两数运算后的符号
//程序将两个大数之间的符号运算和数字运算分开  
//		fuhao(data1,data2,choice,m);
void fuhao (DATA data1,DATA data2 ,char choice, int m)
{
	if(choice=='1') //加法 
	{   
		if(data1.sign>data2.sign) { if(m==2)cout<<"-"; }  //1+(-2)
		if(data1.sign<data2.sign) { if(m==1)cout<<"-"; }  //(-2)+1
		if(data1.sign==-1 && data2.sign==-1) cout<<"-";     
	}
	if(choice=='2') //减法  
	{
		if(data1.sign<data2.sign) cout<<"-";
		if(data1.sign==1 && data2.sign==1) { if(m==2)cout<<"-"; }
		if(data1.sign==-1 && data2.sign==-1) { if(m==1)cout<<"-"; }//(-2)-(-1)
	}
	if(choice=='3')
	{
		if(data1.sign*data2.sign==-1)cout<<"-";
	}
}

//输出大数
//并把数字开头多余的0去掉
void output(DATA data)
{
	int i=0;
Fix:if(data.num[i]==0)
	{
		i++;
		goto Fix;
	}


	for(    ;i<data.len;i++)
		cout<<data.num[i];
	cout<<endl;
}

//加法
DATA plus(DATA &data1,DATA &data2,DATA &data)
{
	int maxlen=(data1.len>=data2.len)?data1.len:data2.len;
	data.len=maxlen;                                  
	int add=0;
	for(int i=0;i<maxlen;i++)
	{
		//如果前边不置0,当长度不同时这里就会有问题。
		//例如1+10, 会变成x1+10, 其中x是个随机数, 所以出来的答案就错了。。
		data.num[i]=(data1.num[i]+data2.num[i]+add) %10;
		if(data1.num[i]+data2.num[i]+add >=10)
			add=1;
		else add=0;
	}

    if (add==1)   //加完最后一位还要进位的情况
	{
		data.len++;
		data.num[data.len-1]=1;
	}
	return data;
}

//减法
DATA minus(DATA &data1,DATA &data2,DATA &data)
{
	//这里的减法只处理同号且data1.num>=data2.num的情况
    int maxlen=(data1.len>=data2.len)?data1.len:data2.len;
	data.len=maxlen;
	int borrow=0;
	for(int i=0;i<maxlen;i++)
	{
		data.num[i]=(data1.num[i]-borrow -data2.num[i] +10) %10;
		if(data1.num[i]-borrow -data2.num[i] <0)
			borrow=1;
		else borrow=0;
	}
	return data;
}

//乘法
DATA multiply(DATA &data1,DATA &data2,DATA &data)
{
    int *p=data.num;
	data.len=data1.len+data2.len;
	p=(int *)malloc((data.len)*sizeof(int));
	for(int i=0;i<data.len;i++)
		data.num[i]=0;
	int add=0;
	for(int i2=0;i2<data2.len;i2++){
		for(int i1=0;i1<data1.len;i1++){
			data.num[i1+i2]=( data.num[i1+i2] +(data1.num[i1]*data2.num[i2]) +add)%10;
			add= (int)((data.num[i1+i2] +(data1.num[i1]*data2.num[i2]) +add)/10);
		}
	}
	return data;
		

		   
}





int main()
{
	DATA data1,data2,data;
    char str1[N],str2[N];
	cout<<"请输入两个大数:"<<endl;
	gets(str1);
	gets(str2);
	initialise(data1,str1);
	initialise(data2,str2);
	int m;
	m=max(data1,data2);
	cout<<"请选择要进行的运算:(加法输入:1   减法输入:2   乘法输入:3)"<<endl;
	char choice;
	choice=getchar();
	if(choice=='1')
	{
		cout<<endl<<"********************************************"<<endl; puts(str1); cout<<"+"<<endl; puts(str2); cout<<"="<<endl;
		fuhao(data1,data2,choice,m);
		if(data1.sign==data2.sign)
			output(turnstr(plus( turnstr(data1), turnstr(data2),turnstr(data))));
		else 
		{
			if(m==1)
				output(turnstr(minus( turnstr(data1), turnstr(data2),turnstr(data))));			
			else
				output(turnstr(minus( turnstr(data2), turnstr(data1),turnstr(data))));
		}
        cout<<"********************************************"<<endl<<endl;
	}
	if(choice=='2')
	{
		cout<<endl<<"********************************************"<<endl; puts(str1); cout<<"-"<<endl; puts(str2); cout<<"="<<endl;
		fuhao(data1,data2,choice,m);
		//同号相减调用减法,异号相减调用加法
		if(data1.sign!=data2.sign)
			output(turnstr(plus( turnstr(data1), turnstr(data2),turnstr(data))));
		else
		{
			if(m==1)
				output(turnstr(minus( turnstr(data1), turnstr(data2),turnstr(data))));			
			else
				output(turnstr(minus( turnstr(data2), turnstr(data1),turnstr(data))));
		}
		cout<<"********************************************"<<endl<<endl;
	}
	if(choice=='3')
	{
		cout<<endl<<"********************************************"<<endl; puts(str1); cout<<"*"<<endl; puts(str2); cout<<"="<<endl;
		fuhao(data1,data2,choice,m);
		output(turnstr(multiply( turnstr(data1),turnstr(data2),turnstr(data))));
	}





	return 0;
}

最新评论

  · · · · · ·  (共0条)

目前还没有评论

登录后您才可以发表评论。 马上登录 立即注册
hpx
2013-04-22加入
Back to Top