天天看点

POJ 1396 Simple Arithmetics

貌似在大一的时候就看见过这个题,当时很丢人的知难而退了。今天周赛又碰见了这道题,要是再不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;
}
           
下一篇: VBS提高