PAT:1010一元多项式求导 (25 )

PAT乙级的题目相对于甲级的题目较为简单,但是有时候也会有一两道题很奇怪,具有一定的逻辑难度,这道题就是一个例子。

先看一下题目:

010 一元多项式求导 (25 分)
设计函数求一元多项式的导数。(注:x
​n
​​(n为整数)的一阶导数为nx
​n−1
​​。)
输入格式:
以指数递降方式输入多项式非零项系数和指数(绝对值均为不超过 1000 的整数)。数字间以空格分隔。
输出格式:
以与输入相同的格式输出导数多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。注意“零多项式”的指数和系数都是 0,但是表示为 0 0。

 

样例就不放了。简单的来说这是一个求导的问题,但是这不完全是一个求导的问题。

因为题目定义了一个叫做0 0的东西,查看数学定义可知道,0的0次方是不被定义的,但是在题目里,0 0表示零多项式,意思就是假如求导后的结果为0.就必须要输出0 0。反之,如果有其它的非零项的存在它就不会输出,因此在只输入一项的情况下,应当判断是不是0 0,然后输出,0 0的情况有两种,一种是输入本身就是0 0,另一种是求导后为0 0.

其他情况的普通数字,只要判断系数项是不是0,就可以判断是否输出了。

同样求导的过程也会被改变,因为任意系数的0次方都是0,所以此时求导,指数是不可以减去1的,这会造成输出错误。

#include <iostream>
#include <algorithm>
using namespace std;


int main(int argc, char** argv) {
	
	char c;
	int mn[1000];
		
	cin>>mn[0]>>mn[1];
	if (mn[0]==0&&mn[1]==0)
	{
		cout<<'0'<<' '<<'0';
		return 0; 
	}
	
	int n=2;
	while(getchar()!='\n')
	{
		cin>>mn[n];
		n++;
	//	cout<<mn[n]<<endl;
	}
	
//	cout<<n;
	
	for (int i=0;i<n;i=i+2)
	{
		if(mn[i+1]==0)
	   	mn[i]=0;
	   	
		else
		 {
		 	mn[i]*=mn[i+1];
	        mn[i+1]--;                              //求导算法处理 
		 }

	}                           

	int ff=0;
	for (int i=0;i<n;i=i+2)
	{          
		if (ff==0)                                  //第一项输出 
		{
			if(mn[i]!=0)                            //系数不为0,则必然输出 
			{
			   cout<<mn[i]<<' '<<mn[i+1];
			   ff=1;
			}
		
		    if(mn[i]==0&&mn[i+1]==0&&n==2)          //只有一项,且为0 0,则输出 
		    {
		       cout<<mn[i]<<' '<<mn[i+1];
			   ff=1;
			}
			
		}
		else                                        //非第一项输出 
		{
			if(mn[i]!=0)                            //系数不为0,则必然输出      
			cout<<' '<<mn[i]<<' '<<mn[i+1];
		}
		    
	}
	
//	cout<<n;
	return 0;
}

  

 

上一篇:An interesting combinational problem


下一篇:Bzoj 1283 (费用流)