设计函数求一元多项式的导数。(注:xn(n为整数)的一阶导数为n*xn-1。)
输入格式:以指数递降方式输入多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。
输出格式:以与输入相同的格式输出导数多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。注意“零多项式”的指数和系数都是0,但是表示为“0 0”。
输入样例:3 4 -5 2 6 1 -2 0
输出样例:
12 3 -10 1 6 0
个人分析:此题主要是如何判断一项是不是0;
我自己把所有数据录入vector中,做了一番求导,再输出时检查是否为零多项式
一个坑点是,如果题目所有的多项式求导后全为零多项式,那么输出0 0;但是如果零多项式前面有非零多项式,则不输出零多项式
- 例如 输入:2 0 输出:0 0
- 输入:6 4 2 0 输出:24 3
看了别人的简短代码,核心是输入两数时就判断,如果两数相乘为0,则其求导后也比为零多项式;如果相乘后不为零,则其求导后也必定不为零多项式。
自己代码:
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int>v;
int temp;
int i;
for(i=0;;i++)
{
cin>>temp;
v.push_back(temp);
if(getchar() == '\n') //遇到回车结束
break;
}
for(i=0;i<v.size();i++)
{
if( (i+1)%2 != 0 ) //系数
v[i] = v[i]*v[i+1];
else //指数
{
if(v[i] == 0) //指数为0
v[i-1]=0;
else
v[i]--;
}
}
int flag=0;
int count=0; //输出了多少个数
for(i=0;i<v.size();i++)
{
if( (i+1)%2 != 0 && v[i] == 0 && flag) //系数为0
continue;
else if ( (i+1)%2 == 0 && v[i-1] == 0 && flag) //指数,系数为0
continue;
else
{
count++;
if(flag)
cout<<" ";
cout<<v[i];
flag = 1;
}
}
if(count == 1) //如果只输出了一个数,表示全是0,再输出一个0
cout<<" 0";
cout<<endl;
return 0;
}
别人代码:
#include <stdio.h>
#include <string.h>
int main()
{
int n, e, flag = 0;
while (scanf("%d%d", &n, &e) != EOF)
{
if( n*e )
{
if(flag)
printf(" ");
else
flag = 1;
printf("%d %d", n*e, e-1);
}
}
if(!flag) printf("0 0");
return 0;
}