📄 1034.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 + -