⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 1034.cpp

📁 哈尔滨工业大学ACM 竞赛网上在线试题集锦的源代码
💻 CPP
字号:
/*  This Code is Submitted by wywcgs for Problem 1034 on 2006-08-15 at 13:03:11 */ 
#include <cstdio>
#include <algorithm>
using namespace std;
 
const int MAX = 1024;
 
class BigInt {
public:
	char bit[MAX];
	int len;
	BigInt(int n = 0) { memset(bit, 0, sizeof(bit)); bit[0] = n; len = 1; }
	void make();
	void operator +=(const BigInt&);
	void operator -=(const BigInt&);
	void operator *=(const BigInt&);
	void prtSpace(int) const;
	void print(bool, int) const;
};
void BigInt::make() {
	int i; memset(bit, 0, sizeof(bit));
	scanf("\n%[0-9]", bit);
	for(len = 0; bit[len] != 0; len++) bit[len] -= '0';
	for(i = 0; 2*i < len; i++) swap(bit[i], bit[len-1-i]);
}
void BigInt::operator +=(const BigInt& bi) {
	int i, lmt = max(len, bi.len);
	for(i = 0; i < lmt; i++) {
		bit[i] += bi.bit[i];
		if(bit[i] >= 10) bit[i+1]++, bit[i] -= 10;
	}
	len = lmt;
	while(bit[len] != 0) len++;
}
void BigInt::operator -=(const BigInt& bi) {
	int i, lmt = max(len, bi.len);
	for(i = 0; i < lmt; i++) {
		bit[i] -= bi.bit[i];
		if(bit[i] < 0) bit[i+1]--, bit[i] += 10;
	}
	while(len > 1 && bit[len-1] == 0) len--;
}
void BigInt::operator *=(const BigInt& bi) {
	int i, j, k; BigInt b;
	for(i = 0; i < len; i++)
		for(j = 0; j < bi.len; j++) {
			b.bit[i+j] += bit[i]*bi.bit[j];
			for(k = 0; b.bit[i+j+k] >= 10; k++) {
				b.bit[i+j+k+1] += b.bit[i+j+k] / 10;
				 b.bit[i+j+k] %= 10;
			}
		}
	b.len = len + bi.len + 5; *this = b;
	while(len > 1 && bit[len-1] == 0) len--;
}
void BigInt::prtSpace(int total) const {
	int i;
	for(i = total-len; i > 0; i--) putchar(' ');
}
void BigInt::print(bool space, int total) const {
	int i;
	if(space) prtSpace(total);
	for(i = len-1; i >= 0; i--) putchar('0'+bit[i]);
	putchar('\n');
}
 
void prtSepr(int, int);
 
int main()
{
	BigInt num[2], result, sim[10];
	char op;
	int t, T, i;
 
	scanf("%d", &T);
	for(t = 0; t < T; t++) {
		num[0].make(); op = getchar(); num[1].make();
		result = num[0];
		switch(op) {
		case '+': result += num[1]; break;
		case '-': result -= num[1]; break;
		case '*': result *= num[1]; break;
		}
		int sep = max(result.len, num[1].len+1), total = max(sep, num[0].len);
		num[0].print(true, total);
		num[1].prtSpace(total-1); putchar(op); num[1].print(false, 0);
		bool final = true;
		if(op == '*') {
			for(i = 1; i < 10; i++) { sim[i] = num[0]; sim[i] *= BigInt(i); }
			for(i = 0; i < num[1].len; i++) {
				BigInt &floor = sim[num[1].bit[i]];
				if(i == 0) prtSepr(max(floor.len, num[1].len+1), total);
				floor.print(true, total-i);
			}
			if(i == 1) final = false;
			else sep = result.len;
		}
		if(final) {
			prtSepr(sep, total);
			result.print(true, total);
		}
		putchar('\n');
	}
	
	return 0;
}
 
void prtSepr(int sep, int total)
{
	int i;
	for(i = total-sep; i > 0; i--) putchar(' '); 
	for(i = 0; i < sep; i++) putchar('-'); putchar('\n');
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -