四则计算器(高精度)

本题为高精度最后一题(也不一定),毕竟乘除b≤10^9,作者尽力了更好的以后更新,如想看分开的加减乘除及比大小(函数我都写在里面了,自己理解自己用)

题目描述

输入两个正整数 a 和 b, 和一个字符表示运算种类, 计算a 和 b的运算结果并输出

【输入格式】

第一行 , 一个正整数, 表示a
第二行,一个字符, 表示运算符
第三行,一个正整数, 表示b

【输出格式】

一行 , 输出 a 和 b 的运算结果
如果运算符为 '+', 输出 a+b;
如果运算符为 '-', 输出 |a−b∣;
如果运算符为 '*', 输出 a×b;
如果运算符为 '/', 输出 a÷b。

【数据范围】

1≤a≤10^1000
对于加减运算: 1≤b≤10^1000
对于乘除运算: 1≤b≤10^9

这题我不写多余的注释了,在这里讲了:思路很简单,就是用数组来模拟竖式运算过程。函数代表什么意思在注释里

#include<bits/stdc++.h>
using namespace std;
void s2big(string s,int a[])//将字符串转数组 
{
	int la=s.size();
	a[0]=la;
	for(int i=1;i<=la;i++)
	{
		a[i]=s[la-i]-'0';
	}
}
void i2big(int n,int a[])//将int类型转数组 
{
	int la=0;
	while(n!=0)
	{
		la++;
		a[la]=n%10;
		n/=10;
	}
	if(la==0) la++;
	a[0]=la;
}
void printbig(int a[])//输出高精度数 
{
	int la=a[0];
	for(int i=la;i>=1;i--)
	{
		cout << a[i];
	}
	cout << endl;
}
void sumbig(int x[],int y[],int z[])//高精度加法,将x+y的结果存到z里 
{
	z[0]=max(x[0],y[0]);
	for(int i=1;i<=z[0];i++)
	{
		z[i]=x[i]+y[i];
	}
	for(int i=1;i<=z[0];i++)
	{
		z[i+1]+=z[i]/10;
		z[i]%=10;
		if(z[z[0]+1]>0)
			z[0]++;
	}
}
bool cmpbigx(int x[],int y[])//判断x是否小于y
{
	int lx=x[0],ly=y[0];
	if(lx!=ly)return lx<ly;
	for(int i=lx;i>=1;i--)
	{
		if(x[i]!=y[i])
			return x[i]<y[i];
	}
	return 0;
}
bool cmpbigda(int x[],int y[])//判断x是否大于y
{
	int lx=x[0],ly=y[0];
	if(lx!=ly)return lx>ly;
	for(int i=lx;i>=1;i--)
	{
		if(x[i]!=y[i])
			return x[i]>y[i];
	}
	return 0;
}
bool cmpbigde(int x[],int y[])//判断x是否等于于y
{
	int lx=x[0],ly=y[0];
	if(lx!=ly)return 0;
	for(int i=lx;i>=1;i--)
	{
		if(x[i]!=y[i])
			return 0;
	}
	return 1;
}
void mulbig(int x[],int y,int z[])//高精度乘法 
{
	z[0]=x[0];
	for(int i=1;i<=z[0];i++)
	{
		z[i]=x[i]*y;
	}
	for(int i=1;i<=z[0];i++)
	{
		z[i+1]+=z[i]/10;
		z[i]%=10;
		if(z[z[0]+1]>0) 
			z[0]++;
	}
}
void subbig(int x[],int y[],int z[])//高精度减法
{
	z[0]=max(x[0],y[0]);
	for(int i=1;i<=z[0];i++)
		z[i]=x[i]-y[i];
	for(int i=1;i<=z[0];i++)
	{
		if(z[i]<0)
		{
			z[i]+=10;
			z[i+1]--;
		}
	}
	while(z[z[0]]==0&&z[0]>1) z[0]--;
}
void divbig(int x[],int y,int z[])//高精度除法 
{
	z[0]=x[0];
	int r=0;
	for(int i=z[0];i>=1;i--)
	{
		int t=r*10+x[i];
		z[i]=t/y;
		r=t%y;
	}
	while(z[z[0]]==0&&z[0]>1) z[0]--;
}
int A[1010],B[1010],ANS[1010];
int main()
{
	char op;
	cin >> op;
	string a;
	cin >> a;
	s2big(a,A);
	if(op=='+')
	{
		string b;
		cin >> b;
		s2big(b,B);
		sumbig(A,B,ANS);
	}
	if(op=='-')
	{
		string b;
		cin >> b;
		s2big(b,B);
		if(cmpbigx(A,B))
			subbig(B,A,ANS);
		else
			subbig(A,B,ANS);
	}
	if(op=='*')
	{
		int b;
		cin >> b;
		mulbig(A,b,ANS);
	}
	if(op=='/')
	{
		int b;
		cin >> b;
		divbig(A,b,ANS);
	}
	printbig(ANS);
	return 0;
}
//本题原创:憨憨是我1,完结撒花!!!!!!!!! 

全体起立,点赞加关注加留言,我肝了三周!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值