高精度与高精度的四则运算

不得不数 PAT要求的是乘法与除法是高精度与一个低精度就行了 但是这题是高精度与高精度 所以花的时间有点多 哎 还是自己太菜
输入
多行输入,每行两个整数,中间用运算符分隔。运算符为±/中的一种,分别表示加减乘整除。除了数字和运算符外,不会出现其余字符。
注意
这里每个操作数位数在1000位以内
样例输入
12+99
50-123
25
25
726/12
样例输出
111
-73
625
60
直接上代码 吧 我写的有注释可以看懂

#include <bits/stdc++.h>
using namespace std;
const int maxn=1010;
struct bign
{
	int len;
	int d[maxn];
	bign()
	{
		memset(d,0,sizeof(d));
		len=0;
	}
};
bign change(char str[])
{
	bign a;
	a.len=strlen(str);
	//低位在数组最开始
	for(int i=0;i<a.len;i++)
	{
		a.d[i]=str[a.len-i-1]-'0';
	}
	return a;
}
bign add(bign a,bign b)
{
	bign c;
	int carry=0;
	for(int i=0;i<a.len||i<b.len;i++)
	{
		int temp=carry+a.d[i]+b.d[i];
		c.d[c.len++]=temp%10;
		carry=temp/10;
	}
	if(carry!=0)
		c.d[c.len++]=carry;
	return c;
}
void print(bign a)
{
	for(int i=a.len-1;i>=0;i--)
	{
		printf("%d",a.d[i]);
	}
	printf("\n");
}
bign sub(bign a,bign b)//减法
{
	bign c;
	for(int i=0;i<a.len||i<b.len;i++)
	{
		if(a.d[i]<b.d[i])  //如果3-4   不够减  我们从高位借10  高位数需要减1  低位需要加10
		{
			a.d[i]+=10; 
			a.d[i+1]--;

		}
		c.d[c.len++]=a.d[i]-b.d[i];
	}
	while(c.d[c.len-1]==0&&c.len-1>=1)
		c.len--;
	return c;
}
bign multi(bign a,bign b)
{
	bign c;
	for(int i=0;i<a.len;i++)
	{
		for(int j=0;j<b.len;j++)
		{
			c.d[i+j]+=a.d[i]*b.d[j];//按乘法
		}
	}
	c.len=a.len+b.len;
	for (int i=0;i<c.len;++i)
		if (c.d[i]>9)
		{
			c.d[i+1]+=c.d[i]/10;
			c.d[i]%=10;
		}//进位
		while(c.d[c.len-1]==0&&c.len-1>=1)
			c.len--;
		return c;

}
bool bigger(bign a,bign b, int aLen, int bLen){ 
    if(aLen < bLen){
        return 0;
    }else if(aLen > bLen){
        return 1;
    }else{`在这里插入代码片`
        for(int i=aLen-1, j=bLen-1; i>=0 && j>=0; i--,j--){
            if(a.d[i]<b.d[j]){
                return 0;
            }else if(a.d[i]>b.d[j]){
                return 1;
            }
        }
        return 1;
    }
}
int sub(bign &a,bign &b, int aLen, int bLen){
    bign c;
	int maxLen=max(aLen,bLen);
    
    for(int i=0; i<maxLen; i++){
        if(a.d[i]<b.d[i]){
            a.d[i] += 10;
            a.d[i+1]--;
        }
        c.d[c.len++]=a.d[i]-b.d[i];
    }
    
   while(c.d[maxLen-1]==0&&maxLen>=1)
		maxLen--;
    
    for(int i=0; i<maxLen; i++){
        a.d[i] = c.d[i];
    }
    return maxLen;
}
bool cmp(bign a,bign b)   //这个函数  是用来测试减法时  如果a<b  我们就需要b-a计算  最后输出的时候前面加上一个-
{
	int lenA=a.len;
	int lenB=b.len;
	if(lenA>lenB)
		return 1;
	else if(lenA<lenB)
		return 0;
	else
	{
		for(int i=lenA-1;i>=0;i--)
		{
			if(a.d[i]>b.d[i])
				return 1;
			else if(a.d[i]<b.d[i])
				return 0;
		}
	}
}
int main()
{
	char str1[maxn],str2[maxn];
	char str3[2*maxn];
	int sum=0;
	while(cin>>str3)
	{
		if(strcmp(str3,"0")==0)
			return 0;
		//如果我们碰到了符号  我们就把符号前后两个数放到char数组里
		int i=0;
		while(str3[i]>='0'&&str3[i]<='9')
		{
			i++;   //12+99   i等于2
		}
		int op=i,z=0,j;
		int len=strlen(str3);
		for(j=0;j<i;j++)
			str1[j]=str3[j];
		str1[j]='\0';
		for(int j=op+1;j<len;j++)
			str2[z++]=str3[j];
		str2[z]='\0';
		bign a=change(str1);
		bign b=change(str2);
		if(str3[op]=='+')
			print(add(a,b));
		else if(str3[op]=='-')
		{
			//首先比较一下大小
			if(cmp(a,b))
				print(sub(a,b));
			else
			{
				printf("-");
				print(sub(b,a));
			}
		}
		else if(str3[op]=='*')
			print(multi(a,b));
		else if(str3[op]=='/')
		{
			//这里是用来被除数能减去除数多少次,减的次数就是商,减完剩下的部分就是余数。
			while(bigger(a, b, a.len, b.len)){    
				a.len= sub(a, b, a.len, b.len);
				sum++;
			}
			 cout << sum << endl; 
		}
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值