貌似在大一的时候就看见过这个题,当时很丢人的知难而退了。今天周赛又碰见了这道题,要是再不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; }
原文:http://blog.csdn.net/zmx354/article/details/19252507