50 WA on many...
查看原帖
50 WA on many...
787131
VictorTang楼主2023/10/19 21:32

求调


(什么是 pts ?)


#include<iostream>
#include<cstring>
#define MAXN 10086
#define MAX2N 20236
using namespace std;
/*50' WA on many...# ? Why*/
string A, B;
bool neg;
int n, m, len, res, a[MAXN], b[MAXN], ans[MAX2N];
long long divisor, dividend;

void Init(){
	memset(a, 0, sizeof(a));
	memset(b, 0, sizeof(b));
	memset(ans, 0, sizeof(ans));
	neg = false;
	divisor = dividend = 0;
	n = A.size();
	m = B.size();
}

void add(){
	len = max(n, m);
	for (int i=0; i<n; i++) a[n-i] = A[i] - '0';
	for (int i=0; i<m; i++) b[m-i] = B[i] - '0';
	for (int i=1; i<=len; i++){
		ans[i] += (a[i] + b[i]);
		ans[i+1] += ans[i] / 10;    // 处理进位
		ans[i] %= 10;
	}
	if (ans[len+1] != 0) len ++;    // 位数增加
	while (len) cout << ans[len --];
}

void sub(){
    if ((A.size() < B.size()) or (A.size() == B.size() and A < B)){
    	swap(A, B);
    	neg = true;
	}
	n = A.size();
	m = B.size();
	len = max(n, m);
	for (int i=0; i<n; i++) a[n-i] = A[i]-'0';
	for (int i=0; i<m; i++) b[m-i] = B[i]-'0';

	for (int i=1; i<=len; i++){
		ans[i] += a[i] - b[i];
		if (ans[i] < 0){
			ans[i] += 10; 
			ans[i+1] --;
		}
	}

	while (ans[len] == 0 and len > 1) len --; 
	if (neg){
		cout << '-';
		swap(A, B);
	}
	while (len) cout << ans[len--]; // 逐位输出
}

void mul(){
	len = n + m;
	for (int i=0; i<n; i++) a[n-i] = A[i] - '0';
	for (int i=0; i<m; i++) b[m-i] = B[i] - '0';
	for (int i=1; i<=n; i++){
		for (int j=1; j<=m; j++){
			int pos = i + j - 1;
			ans[pos] += a[i] * b[j];
			ans[pos+1] += ans[pos] / 10;
			ans[pos] %= 10;
		}
	}
	while (ans[len] == 0 and len > 1) len --; 
	while (len) cout << ans[len--];
}

void div(){
	len = max(n, m);
	for (int i=0; i<n; i++) a[i+1] = A[i] - '0';
	for (int i=0; i<m; i++) divisor = divisor * 10 + B[i] - '0';

	for (int i=1; i<=len; i++){
		dividend = dividend * 10 + a[i];
		ans[i] = dividend / divisor;
		dividend %= divisor;
	}
	int i = 1;
	while (ans[i] == 0 and i < len) i++;   
	while (i <= len) cout << ans[i++];
}

void rem(){
	for (int i=0; i<n; i++) a[i+1] = A[i] - '0';
	for (int i=0; i<m; i++) divisor = divisor * 10 + B[i] - '0';
	for (int i=1; i<=len; i++){
		res = res * 10 + a[i];
		res %= divisor;
	}
	cout << res;
}

int main(){
	cin >> A >> B;

    Init();
	add(); cout << endl;
	
    Init();
	sub(); cout << endl;
	
    Init();
	mul(); cout << endl;
	
	if ((A.size() < B.size()) or (A.size() == B.size() and A < B)){
		cout << 0 << endl << A;
	} else {
		Init();
		div();
		cout << endl;
	    Init();
		rem();
	}
}

Please ...

2023/10/19 21:32
加载中...