PAT (Basic Level) Practice 1010 一元多项式求导

一、概述

给出一个一元多项式,求出它的导函数。

令人尴尬的一道题。本质上考点就是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”形式来读取,否则会不断报错。

三、总结

这应该算是黑盒测试的一个套路了,应该记牢。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值