1 条题解

  • 0
    @ 2025-4-9 22:17:03

    加法/减法 ​​

    对齐数字: 将两个数字的个位数对齐,较短的数字前面补空格。

    操作符位置: 操作符(++-)放在第二个数字的最前面。

    水平线: 水平线的长度由两个数字的最左和最右位置决定。

    结果对齐: 结果与两个数字的个位数对齐。

    乘法 ​​

    对齐数字: 将两个数字的个位数对齐,较短的数字前面补空格。

    操作符位置: 操作符(*)放在第二个数字的最前面。

    部分积: 从第二个数字的个位数开始,依次计算部分积,并右对齐到对应的数字位。

    ​​水平线: 如果第二个数字的位数大于11,需要在部分积下方画一条水平线,然后输出总和。

    结果对齐: 总和与部分积的最右位置对齐。

    #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
    上传者