1 条题解
-
0
加法/减法
对齐数字: 将两个数字的个位数对齐,较短的数字前面补空格。
操作符位置: 操作符(或)放在第二个数字的最前面。
水平线: 水平线的长度由两个数字的最左和最右位置决定。
结果对齐: 结果与两个数字的个位数对齐。
乘法
对齐数字: 将两个数字的个位数对齐,较短的数字前面补空格。
操作符位置: 操作符()放在第二个数字的最前面。
部分积: 从第二个数字的个位数开始,依次计算部分积,并右对齐到对应的数字位。
水平线: 如果第二个数字的位数大于,需要在部分积下方画一条水平线,然后输出总和。
结果对齐: 总和与部分积的最右位置对齐。
#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,Max,MAXN; scanf("%d",&T); while(T--) { for(i = 0;'0' <= s[i] && s[i] <= '9'; ++i) ; if(s[i] == '*') { int 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; }
- 1
信息
- ID
- 397
- 时间
- 1000ms
- 内存
- 10MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者