貌似在大一的时候就看见过这个题,当时很丢人的知难而退了。今天周赛又碰见了这道题,要是再不A掉就真对不起这道题了。
感觉这道题唯一的坑就是横线,横线的长度只取决于其上下两个数。再就是一个数是0时,要记得输出一个0.
话说今天差点就被这个题搞吐啦,一直以为自己错在了横线的规则上,然后学姐甩过来一组数据,直接给跪了。。。。
开始的时候,代码没有这么挫的。。。。因为一直在TLE,然后就改成这个烂样了。。。。
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#define ULL unsigned long long int
using namespace std;
int num[503][1002];
int len[503];
char s[1002];
int main()
{
int i,j,T,u,v,Max,MAXN;
scanf("%d",&T);
while(T--)
{
for(i = 0;'0' <= s[i] && s[i] <= '9'; ++i)
;
if(s[i] == '*')
{
int l1 = i,l2 = strlen(s)-i + 2;
for(u = 0;u <= l2; ++u)
{
memset(num[u],0,sizeof(num[0]));
}
}
else
{
memset(num[0],0,sizeof(num[0]));
memset(num[2],0,sizeof(num[2]));
memset(num[1],0,sizeof(num[1]));
}
Max = -1,MAXN = -1;
scanf("%*c%s",s);
for(j = 0,i = strlen(s)-1; '0' <= s[i] && s[i] <= '9' ; --i)
{
num[1][j++] = s[i]-'0';
}
int site = i;
len[0] = i;
len[1] = j;
MAXN = max(len[0],len[1]);
for(--i,j = 0;s[i] != '\0'; --i)
{
num[0][j++] = s[i]-'0';
}
if(s[site] == '+')
{
int dd = max(len[0],len[1]);
for(i = 0;i < dd; ++i)
{
num[2][i] = num[1][i] + num[0][i];
}
int cc = max(len[1],len[0]);
for(i = 1;i <= cc; ++i)
{
num[2][i] += num[2][i-1]/10;
num[2][i-1] %= 10;
}
for(i = MAXN;num[2][i] == 0; --i)
;
len[2] = i+1;
for(i = max(len[0],max(len[1]+1,len[2]));i > len[0]; --i)
{
printf(" ");
}
for(--i;i >= 0; --i)
{
printf("%d",num[0][i]);
}
printf("\n");
for(i = max(len[0],max(len[1]+1,len[2]));i > len[1]+1; --i)
{
printf(" ");
}
printf("+");
for(i -= 2;i >= 0; --i)
{
printf("%d",num[1][i]);
}
printf("\n");
for(i = max(len[0],max(len[1]+1,len[2]));i > 0; --i)
{
printf("-");
}
printf("\n");
for(i = max(len[0],max(len[1]+1,len[2]));i > len[2]; --i)
{
printf(" ");
}
for(--i;i >= 0; --i)
{
printf("%d",num[2][i]);
}
printf("\n\n");
}
else if(s[site] == '-')
{
int temp = max(len[1]+1,len[2]);
int bbb = max(len[0],len[1]);
for(i = 0;i < bbb; ++i)
{
num[2][i] = num[0][i] - num[1][i];
}
int aaa = max(len[1],len[0]);
for(i = 0;i <= aaa; ++i)
{
if(num[2][i] < 0)
{
num[2][i] += 10;
num[2][i+1]--;
}
}
for(i = MAXN;i >= 1 && num[2][i] == 0 ; --i)
;
len[2] = i+1;
for(i = max(len[0],max(len[1]+1,len[2]));i > len[0]; --i)
{
printf(" ");
}
for(--i;i >= 0; --i)
{
printf("%d",num[0][i]);
}
printf("\n");
for(i = max(len[0],max(len[1]+1,len[2]));i > len[1]+1; --i)
{
printf(" ");
}
printf("-");
for(i -= 2;i >= 0; --i)
{
printf("%d",num[1][i]);
}
printf("\n");
temp = max(len[1]+1,len[2]);
for(i = max(len[0],max(len[1]+1,len[2]));i > temp; --i)
{
printf(" ");
}
for(--i;i >= 0; --i)
{
printf("-");
}
printf("\n");
for(i = max(len[0],max(len[1]+1,len[2]));i > len[2]; --i)
{
printf(" ");
}
for(--i;i >= 0; --i)
{
printf("%d",num[2][i]);
}
printf("\n\n");
}
else
{
for(i = 0;i < len[1]; ++i)
{
for(j = 0;j < len[0]; ++j)
{
num[i+2][i+j] = num[1][i]*num[0][j];
num[len[1]+2][i+j] += num[i+2][i+j];
}
}
for(i = 2;i <= len[1]+2; ++i)
{
MAXN = i+len[0];
for(j = 0;j <= MAXN; ++j)
{
num[i][j+1] += num[i][j]/10;
num[i][j] %= 10;
//cout<<"i = "<<i<<" j = "<<j<<" num = "<<num[i][j]<<endl;
}
}
Max = max(len[0],len[1]+1);
int pp = len[1]+2;
for(i = 2;i <= pp; ++i)
{
for(j = len[0]+i;j >= 1 && num[i][j] == 0; --j)
;
len[i] = j+1;
Max = max(Max,len[i]);
}
for(i = Max;i > len[0]; --i)
{
printf(" ");
}
for(--i;i >= 0; --i)
{
printf("%d",num[0][i]);
}
printf("\n");
for(i = Max;i > len[1]+1; --i)
{
printf(" ");
}
printf("*");
for(i -= 2;i >= 0; --i)
{
printf("%d",num[1][i]);
}
printf("\n");
int tt = max(len[1]+1,len[2]);
for(i = Max;i > tt; --i)
{
printf(" ");
}
for(--i;i >= 0; --i)
{
printf("-");
}
printf("\n");
for(i = 2;i <= len[1]+1; ++i)
{
if(len[i] == 1)
{
for(j = Max;j > len[i]+i-2; --j)
{
printf(" ");
}
printf("%d",num[i][0]);
}
else
{
for(j = Max;j > len[i]; --j)
{
printf(" ");
}
for(--j; j >= i-2; --j)
{
printf("%d",num[i][j]);
}
}
printf("\n");
}
if(len[1] != 1)
{
int temp = -1;
for(i = 2;i <= len[1]+2; ++i)
{
temp = max(temp,len[i]);
}
for(i = Max;i > temp; --i)
{
printf(" ");
}
for(--i;i >=0; --i)
{
printf("-");
}
printf("\n");
i = len[1]+2;
for(j = Max;j > len[i]; --j)
{
printf(" ");
}
for(--j; j >= 0; --j)
{
printf("%d",num[len[1]+2][j]);
}
printf("\n");
}
printf("\n");
}
}
return 0;
}