SHUOJ多项式构造

描述

(1)多项式的项必须按其指数从高到低排列。 (2)指数必须跟在符号“^”后显示。 (3)有常数的只显示常数项。 (4)只显示系数不为0的项;系数全0,需显示常数项。 (5)项与项间的加号或减号的两边需加上空格。 (6)首项是正系数,其前不加符号,否则加负号,负号 与系数间不加空格。 (7)负系数的项要显示成减一个正数项。 (8)系数是1,指数为0时,系数的1才显示。

我的想法

原题语句不通实在叫人难受,这是在网上找到的较好版本,原题是2013SHU暑期集训(感谢默默如潮的博客),当然百度文库里沈云付老师的<分治与构造>也有这道题,不过还不适合我这种萌新。然而问题是博客里给出的AC代码测试后有一些问题然而它AC了,本渣辛辛苦苦码的则是玄学wrong answer。故在此贴出代码希望有大佬能看出我的问题所在。另外再吐槽一下OJ里样例那神奇的负号是怎么打出来的。

代码比对

AC代码

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int a[10];
void Print()
{
    int j=0;
    while (a[j]==0 && j<8)
        ++j;
    bool flag=false;
    if (j==8)
        flag=true;
    if (j!=8)
    {
        if (a[j]<0)
        {
            printf("-");
            a[j]*=-1;
        }
        if (a[j]>1)
        {
            if (j<7) printf("%dx^%d",a[j],8-j);
            if (j==7) printf("%dx",a[j]);
        }
        else
        {
            if (j<7) printf("x^%d",8-j);
            if (j==7) printf("x");
        }
    }
    if (j!=8) ++j;
    while (j<8)
    {
        while (a[j]==0)
            ++j;
        if (j>=8) break;
        printf(" ");
        if (a[j]>0)
            printf("+ ");
        else
        {
            printf("- ");
            a[j]*=-1;
        }
        if (a[j]>1)
        {
            if (j<7)
                printf("%dx^%d",a[j],8-j);
            if (j==7)
                printf("%dx",a[j]);
        }
        else
        {
            if (j<7)
                printf("x^%d",8-j);
            if (j==7)
                printf("x");
        }
        ++j;
    }
    if (a[j]!=0)
    {
        if (!flag)
            printf(" ");
        if (!flag && a[j]>0)
            printf("+");
        if (a[j]<0)
        {
            printf("-");
            a[j]*=-1;
        }
        if (!flag) printf(" ");
        printf("%d",a[j]);
    }
    else if (flag)
        printf("0");
    printf("\n");
}

int main()
{
    while (scanf("%d",&a[0])!=EOF)
    {
        for(int i=1;i<9;++i)
        scanf("%d",&a[i]);
        Print();
    }
}

WA代码

#include<stdio.h>
#include<string.h>
int main()
{
    int a[10];
    char str[100];
    const char *b;
    while(gets(str)!=NULL)
    {
        int i;
        b=strtok(str," ");
        a[0]=atoi(b);
        for(i=1;i<9;i++)
        {
            b=strtok(NULL," ");
            a[i]=atoi(b);
        }
        i=0;
        while(a[i]==0&&i<8)   //find the first term
        {
            i++;
        }
        if(i==8)
            printf("%d\n",a[i]);  //monomial
        else if(i!=8)
        {
            if(a[i]!=-1&&a[i]!=1)       //the first term
                printf("%dx^%d",a[i],8-i);
            else if(a[i]==1)
                printf("x^%d",8-i);
            else if(a[i]==-1)
                printf("-x^%d",8-i);
            for(i=i+1;i<7;i++)       //the middle terms
            {
                if(a[i]>0&&a[i]!=1)
                    printf(" + %dx^%d",a[i],8-i);
                else if(a[i]==1)
                    printf(" + x^%d",8-i);
                else if(a[i]<0&&a[i]!=-1)
                    printf(" - %dx^%d",a[i]*(-1),8-i);
                else if(a[i]==-1)
                    printf(" - x^%d",8-i);
            }
            if(a[i]>0&&a[i]!=1)       //the x term
                printf(" + %dx",a[i]);
            else if(a[i]==1)
                printf(" + x");
            else if(a[i]<0&&a[i]!=-1)
                printf(" - %dx",a[i]*(-1));
            else if(a[i]==-1)
                printf(" - x");
            i++;
            if(a[i]>0)             //the last term
                printf(" + %d\n",a[i]);
            else if(a[i]<0)
                printf(" - %d\n",a[i]*(-1));
            else if(a[i]==0)
                printf("\n");
        }
        memset(str,100,'\0');
    }
    return 0;
}

输入

0 0 1 2 3 4 5 6 7
0 0 0 0 0 0 -55 5 0
0 0 0 0 0 0 0 0 0
1000 1000 0 3 6 -55 -100 3 0
-1 0 1 0 0 0 6 0 -1
0 0 0 6 -1 2 0 0 0
1000 205 320 56 54 -3 0 0 0

输出对比

AC代码
WA代码

疑惑

第一个是AC代码的输出第二个是我自己代码的输出。可以看到在倒数两行数据上“AC”代码最后的常数项都出现了输入中并不存在的2。这个2是怎么冒出来的以及这是怎么AC过的(怎么想都是我写的代码对)?还望高人指点。

猜你喜欢

转载自blog.csdn.net/waveviewer/article/details/76283558