一、概述
给出一个一元多项式,求出它的导函数。
令人尴尬的一道题。本质上考点就是while-EOF的运用,如果没有这一点还是很简单的。
关键就在于输入既没有个数限制又没有尾部特殊符号,这样一来平时使用的输入方法都无效了,所以代码写的很是蛋疼。
二、分析
我最开始是用判断输入是否为‘\n’来判断输入完成的,发现oj直接报错。
然后使用EOF,关于EOF有以下几点注意:
我使用的是VS2015,在这一版本里,控制台输入ctrl+z,scanf返回的不是-1,但是while循环的确结束了,所以如果要debug,不能判断scanf的返回值是否为EOF,应判断返回值是否为0,返回值为0可以正确退出循环。
但是奇怪的是,返回值为0对于oj无效,oj必须使用EOF,同时有趣的是,按以下方式写的代码也会报错(这是我最开始的思路)
#include<stdio.h>
int main()
{
int exp, cof;
scanf("%d %d", &cof, &exp);
if (cof == 0 && exp == 0)
printf("0");
else
{
printf("%d %d", cof*exp, exp - 1);
while (scanf("%d", &cof) != EOF)
{
scanf("%d", &exp);
if (exp == 0 && exp != 0)
;
else
printf(" %d %d", cof*exp, exp - 1);
}
}
}
上述代码运行后的效果是死循环,因为判断条件是EOF,改为0可以退出循环,VS的结果也是正确的。但是无论是0还是EOF在oj中都报错,这让我很是纠结。猜测是使用读入一个文件的形式,必须选择使用while-EOF的形式全部读入然后再操作。
正确代码如下:
#include<stdio.h>
int main()
{
int COF[1001] = { 0 };
int exp, cof;
while (scanf("%d %d", &cof, &exp) != 0)
COF[exp] = cof;
int num=0;
int i;
COF[0] = 0;
for (i = 1; i < 1001; i++)
{
if (COF[i] != 0)
{
COF[i - 1] += COF[i] * i;
COF[i] = 0;
num++;
}
}
if (num == 0)
printf("0 0");
else
{
for (i = 1000; i >=0; i--)
{
if (COF[i] != 0)
{
if (num == 1)
printf("%d %d", COF[i], i);
else
printf("%d %d ", COF[i], i);
num--;
}
}
}
}
首先读入所有数据,然后处理。
本题的重点便是“如果输入没有任何限制结束的特征,那就要使用while-EOF”形式来读取,否则会不断报错。
三、总结
这应该算是黑盒测试的一个套路了,应该记牢。