1010 一元多项式求导

1010 一元多项式求导(25 分)

设计函数求一元多项式的导数。(注:x​n​​(n为整数)的一阶导数为nx​n−1​​。)

输入格式:

以指数递降方式输入多项式非零项系数和指数(绝对值均为不超过 1000 的整数)。数字间以空格分隔。

输出格式:

以与输入相同的格式输出导数多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。注意“零多项式”的指数和系数都是 0,但是表示为 0 0

输入样例:

3 4 -5 2 6 1 -2 0

输出样例:

12 3 -10 1 6 0

这道题提交一次就通过了哈哈哈哈。不过事先查看了别人写的代码,因为不知道如何接收数据。之前在mooc做的类似的题,好歹还给了项数,用数组存储即可。可是没有给出来,处理起来就有点麻烦。借鉴了别人的代码,也学习了各种关于字符处理的函数,虽然没用上,但还是收获不少。对了,刚开始我还想着用链表做,查了之后发现大家的代码都好简单,没有往链表的方向想,我中毒太深了,怎么想法都这么复杂..... 

参考代码1:

#include<iostream>
using namespace std;

int main()
{
	int a, b;
	int flag = 1;
	int flag2 = 0;//flag2作用是格式控制
	while (cin >> a >> b)
	{
		if (b != 0)//当有非常数项时,常数项不必处理,用标记flag=0表示有非常数项
		{
			if (flag2 == 0)
			{
				cout << a*b << " " << b - 1 ;
				flag = 0;
				flag2 = 1;
			}
			else
				cout<<" "<<a*b << " " << b - 1;
		}
		if (b == 0 && flag == 1)//当遇到次数为0的项,依据flag判断是否只有常数项
			cout << "0 0";
	}
	system("pause");
	return 0;
}

 其中,while(cin>>a>>b){};是一种接收不定数量的数据的一种方式。当输入的数不是整数(a,b定义为整型数),或者遇到文件结束符(对于如何指出文件结束,不同的系统有不同的约定,对windows系统来说,ctrl+Z,然后按enter键或return键),cin>>a>>b被判定为假,结束循环。需要注意的是,用cin>>的方式接收数据,空格键和回车键是作为分割符,不以它们的行为输入信息。我看有的人用“当接收到换行符时跳出循环”的思想来写程序,也是可以的。但如果用的是while(cin>>a>>b){};这个循环,按下回车键并不能结束循环,这个方法与有的人用的c语言写的while (scanf("%d%d", &n, &e) != EOF){};是同一种方法。

这里再提一嘴,有的人用“当接收到次数为零的项”作为终止循环的条件,好像也能通过。这个想法是默认输入的数据最后一项一定是常数项。第一,题目并没有说输入的数据一定有常数项且常数项是最后一项,用这个想法写的程序能通过,想来是测试的数据并不全面,全部都是常数项作为最后一项的测试数据。第二,题目说,非零项系数和指数是(绝对值均为不超过 1000 的整数),也就是次数可能为负数,应该也没相应的测试数据。这个题目不严谨,题目中特别容易被忽略的点没有给出相应的测试数据。

参考代码2:

 

#include<iostream>
using namespace std;

int main()
{
	int a, b;
	char c;
	int flag = 1, flag2 = 0;//flag2作用是格式控制
	while ((c = getchar()) != 10)
	{
		ungetc(c, stdin);
		cin >> a >> b;
		if (b != 0)//当有非常数项时,常数项不必处理,用标记flag=0表示有非常数项
		{
			if (flag2 == 0)
			{
				cout << a*b << " " << b - 1;
				flag = 0;
				flag2 = 1;
			}
			else
				cout << " " << a*b << " " << b - 1;
		}
		if (b == 0 && flag == 1)//当遇到次数为0的项,依据flag判断是否只有常数项
			cout << "0 0";
	}
	system("pause");
	return 0;
}

有的人用了getchar()和ungetc()的配合,学习了。getchar()是stdio.h中的库函数,我没有把对应的头文件包含进来,在oj和vs2015均能编译成功......两段代码的不同之处在于读取数据的方式不同。getchar()的作用是从stdin流中读入一个字符,也就是说,如果stdin有数据的话不用输入它就可以直接读取了。ungetc的使用是必须的。如果输入3 4 2 1,首先3存入c,不是换行符,于是进入循环,这时候cin>>a>>b,a,b分别是4 2了。不是我们要做的。使用ungetc把作为循环条件的3退回到输入流,a,b才分别是3 4 。这个方法我也是看了别人的才学会的,挺好。

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值