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