using namespace std;
#include <cstdio>
#include <iostream>
const int MAX = 520;
char sign;
char m[MAX][MAX*2];
int n[MAX];
void init_data();
void print(int, int);
void operate();
void copy(char*, int);
void sum();
void subtract();
void multiply();
bool isdigit(char);
int main()
{
int t;
scanf("%d\n", &t);
while (t--)
{
init_data();
operate();
printf("\n");
}
return(0);
}
void sum()
{
int i, x, y, b, size = max(n[0], n[1]);
for (b=i=0; i<size; i++)
{
x = (m[0][i] == ' ') ? 0: m[0][i] - '0';
y = (m[1][i] == ' ') ? 0: m[1][i] - '0';
b += x + y;
m[3][i] = b % 10 + '0';
b /= 10;
n[3]++;
}
if (b != 0)
{
m[3][i] = b % 10 + '0';
n[3]++;
}
m[1][n[1]++] = sign;
n[2] = max(n[1], n[3]);
for (i=0; i<MAX; m[2][i] = ' ', i++);
for (int i=0; i<n[2]; m[2][i] = '-', i++);
print(3, max(n[0], n[2]));
}
void subtract()
{
int r, i, x, y, b, size = max(n[0], n[1]);
for (b=r=i=0; i<size; i++)
{
x = (m[0][i] == ' ') ? 0: m[0][i] - '0';
y = (m[1][i] == ' ') ? 0: m[1][i] - '0';
b = x - y - r;
if (b < 0) b += 10, r = 1;
else r = 0;
m[3][i] = b + '0';
n[3]++;
}
for (i=n[3]-1; i>0 and m[3][i] == '0'; i--) m[3][i] = ' ', n[3]--;
m[1][n[1]++] = sign;
n[2] = max(n[1], n[3]);
for (i=0; i<MAX; m[2][i] = ' ', i++);
for (int i=0; i<n[2]; m[2][i] = '-', i++);
print(3, max(n[0], n[2]));
}
void multiply()
{
bool zero;
int x, y, i, j, k, r;
if (n[1] == 1) //Multiplication by one-digit number
{
r = 3;
for (x=i=0; i<n[0]; i++)
{
x += (m[1][0] - '0') * (m[0][i] - '0');
m[r][i] = x % 10 + '0';
n[r]++;
x /= 10;
}
if (x != 0)
{
m[r][i] = x % 10 + '0';
n[r]++;
}
m[1][n[1]++] = sign;
x = max(n[0], max(n[1], n[r]));
for (j=x-1; j>0 and m[r][j] == '0'; j--) m[r][j] = ' ', n[r]--;
n[2] = max(n[1], n[3]);
for (i=0; i<MAX; m[2][i] = ' ', i++);
for (int i=0; i<n[2]; m[2][i] = '-', i++);
print(r, x);
}
else
{
r = n[1] + 4;
for (i=0; i<MAX; i++) m[r][i] = '0', m[r-1][i] = ' ';
for (i=3; i<r-1; i++) for (j=0; j<MAX; j++) m[i][j] = 'x';
for (x=y=i=0, k=3; i<n[1]; i++, k++)
{
for (zero=true, j=0; j<n[0]; j++)
{
x += (m[1][i] - '0') * (m[0][j] - '0');
m[k][i+j] = x % 10 + '0';
n[k]++;
if (m[r][i+j] == '0') n[r]++;
y += m[r][i+j] - '0' + m[k][i+j] - '0';
m[r][i+j] = y % 10 + '0';
x /= 10, y /= 10;
}
if (x != 0 or y != 0)
{
m[k][i+j] = x % 10 + '0';
n[k]++;
if (m[r][i+j] == '0') n[r]++;
y += m[r][i+j] - '0' + m[k][i+j] - '0';
m[r][i+j] = y % 10 + '0';
x /= 10, y /= 10;
}
for (j=i; j<n[k] + i and zero; j++) if (m[k][j] != '0') zero = false;
if (zero) for (j=i+1; j<n[k] + i; j++) m[k][j] = ' ';
for (j=n[k]+i-1; j<MAX; j++)
if (!isdigit(m[k][j]) or m[k][j] == '0' and n[k] > 1) m[k][j] = ' ';
}
if (x != 0)
{
m[k][i+j] = x % 10 + '0';
n[k]++;
if (m[r][i+j] == '0') n[r]++;
y += m[r][i+j] - '0' + m[k][i+j] - '0';
m[r][i+j] = y % 10 + '0';
}
m[1][n[1]++] = sign;
n[2] = n[1];
x = max(n[0], max(n[1], n[r]));
for (j=x-1; j>0; j--)
{
if (m[r][j] == '0') m[r][j] = ' ', n[r]--;
else if (m[r][j] != 'x') break;
}
for (i=0; i<=n[r]; i++) m[r-1][i] = '-';
for (i=0; i<MAX; m[2][i] = ' ', i++);
for (int i=0; i<max(n[1], n[3]); m[2][i] = '-', i++);
for (int i=0; i<max(n[r-2], n[r]); m[r-1][i] = '-', i++);
print(r, max(n[0], max(n[1], n[r])));
}
}
void operate()
{
if (sign == '+') sum();
if (sign == '-') subtract();
if (sign == '*') multiply();
}
void print(int r, int c)
{
int i, j;
for (i=0; i<=r; printf("\n"), i++)
for (j=c-1; j>=0; j--)
if(m[i][j] != 'x') printf("%c", m[i][j]);
}
void copy(char *s, int x)
{
int i, j;
for (i=n[x]-1, j=0; i>=0; i--, j++) m[x][j] = s[i];
}
void init_data()
{
int i, j;
char c, tmp[MAX];
for (i=0; i<2; i++) for (j=0; j<MAX; j++) m[i][j] = ' ';
for (i=0; i<MAX; i++) m[3][i] = ' ', n[i] = 0;
for (i=0; isdigit(c=getchar()); n[0]++, i++) tmp[i] = c;
copy(tmp, 0);
sign = c;
for (i=0; isdigit(c=getchar()); n[1]++, i++) tmp[i] = c;
copy(tmp, 1);
}
bool isdigit(char c)
{
return(c >= 48 and c <= 57);
}
I have tested about 200 cases and it gives me the right answer, I don't know why I still getting wrong answer
I thank you in advance for any tricky case that breaks my code or tell me what is the bug in my program