大数运算(大数加减乘除)

#include<bits/stdc++.h>
#define ios ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define int long long
#define loop(n) for(int i=0;i<n;i++)
#define rloop(n) for(int i=n-1;i>=0;i--)
#define print(c) cout<<"this "#c" is "<<c<<endl;
#define MAX INT_MAX
#define MIN INT_MIN
#define N 1010
using namespace std;
void solve() {

}
signed main() {
	ios;
	string a, b; cin >> a >> b;
	deque<int> A, B;//逆序存入数组
	rloop(a.size())A.push_back(a[i] - '0');
	rloop(b.size())B.push_back(b[i] - '0');
	auto add = [&](deque<int> A,deque<int> B) {
		int t = 0;//用来存进位
		deque<int> C;
		loop(max(A.size(),B.size())){
			if (i < A.size())t += A[i];
			if (i < B.size())t += B[i];
			C.push_back(t % 10);
			t /= 10;
		}
		return C;
		};
	auto sub = [&](deque<int> A, deque<int> B) {
		auto cmp = [&]() {
			if (A.size() != B.size())return A.size() > B.size() ? 1 : -1;
			else {
				loop(A.size())
					if (A[i] != B[i])return A[i] > B[i] ? 1 : -1;
				return 0;
			}
			};
		int flag = cmp();
		if (flag<0) {
			deque<int>C = A;
			A = B, B = C;
		}
		//保证A>B再做减法
		int t = 0;
		deque<int> C;
		loop(max(A.size(), B.size())) {
			if(i<A.size())t+=A[i];
			if(i<B.size())t-=B[i];
			int T = t%10;
			C.push_back((t < 0 ?  t=-1,T + 10 : t=0,T));
		}
		//去掉导0
		while (C.size() > 1 && C.back() == 0)C.pop_back();
		if (flag < 0)C[C.size() - 1] *= -1;
		return C;
		};
	auto mul = [&](deque<int>A, deque<int>B) {
			vector<int> C;
			int t = 0,b=0;
			loop(B.size())b += pow(10, i) * B[i];
			for (int i = 0; i < A.size() || t; i++)
			{
				if (i < A.size()) t += A[i] * b;
				C.push_back(t % 10);
				t /= 10;
			}
			return C;
		};
	auto div = [&](deque<int>A, deque<int>B, int& r) {
		int b = 0; loop(B.size())b = b * 10 + B[i];
		deque<int> C;
		r = 0;
		loop(A.size()){
			r = r * 10 + A[i];
			C.push_back(r / b);
			r %= b;
		}
		reverse(C.begin(), C.end());
		//去掉前导0
		while (C.size() > 1 && C.back() == 0) C.pop_back();
		return C;
		};
	int r;
	auto C = div(A, B,r);
	rloop(C.size())cout << C[i];
	cout << ':' << r << endl;
	return 0;
}


注释:这里可能使用了lamda语法,如下:c++的lamda表达式-优快云博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值