1010 一元多项式求导 (25 分)
设计函数求一元多项式的导数。(注:xn(n为整数)的一阶导数为nxn?1。)
输入格式:
以指数递降方式输入多项式非零项系数和指数(绝对值均为不超过 1000 的整数)。数字间以空格分隔。
输出格式:
以与输入相同的格式输出导数多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。注意“零多项式”的指数和系数都是 0,但是表示为 0 0
。
输入样例:
3 4 -5 2 6 1 -2 0
输出样例:
12 3 -10 1 6 0
思路
- 开一个数组a[],用来存放对应指数的系数,例如a[e]就是指数为e的项的系数。
- 然后使用while.. EOF的格式来读入系数和指数,具体见配套用书2.10.2节。
- 从低次项至高次项进行枚举(不能反过来),通过求导公式修改数组a的元素,同时计数不为零的导数项的个数。
- 最后从高次项到低次项进行枚举,输出非零项的系数和指数。
- 注意点
- 经测试,该题的指数都是非负整数,不存在负指数的情况。
- 对零次项的求导需要特判其直接为0。
- 在求导后,当前系数必须清空为0,否则可能后面无法被覆盖。
- 求导部分必须从低次项枚举到高次项,否则结果为出错。关于这点,不妨自己动手模
拟一下从高次到低次进行枚举的过程。 - 如果求导之后没有任何非零项,需要输出00, 这是本题的一个“陷阱”。
参考答案
#include<stdio.h>
int main(){
int a[1010] = {0};
int k, e, count = 0;
while(scanf("%d%d", &k, &e) != EOF){
a[e] = k;
}
a[0] = 0;//指数为0的就是常数项,常数项求导直接为0
for(int i = 1; i<=1000;i++){//从一次项开始枚举
a[i-1] = a[i] * i;//求导公式
a[i] = 0;//在求导之后,当前系数必须清空为0,否则后面可能无法被覆盖,所以这句不能省
if(a[i-1] != 0) count ++;//count计数不为0的导数项的个数
}
if(count == 0) printf("0 0");//特判
else{
for(int i = 1000; i >= 0; i--){
if(a[i] != 0){
printf("%d %d", a[i], i);
count--;
if(count != 0) printf(" ");
}
}
}
return 0;
}
思路(柳婼大佬)
分析:
- flag?来判断是否已经有过输出~
- 当b!=0时,因为给出的是所有?零项系数,所以必定会有输出,先判断flag是否为1,如果为1表示已 经有过输出,那么在前?要先输出?个空格
- 输出 a * b (求导后的系数)和 b – 1(求导后的指数),然后将flag标记为1表示已经有过输出 4.最后判断当没有输出并且b==0的时候, 输出“0 0”
参考代码
#include<iostream>
using namespace std;
int main(){
int a, b, falg = 0;
while(cin >> a >> b){
if(b != 0){//如果b==0那么就不会进入这个循环,即只有常数项系数,那么falg就不会为1
if(flag == 1) cout << "";
cout << a * b << " " << b - 1;
falg = 1;
}
}
if(falg == 0) cout << "0 0";
}