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

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

设计函数求一元多项式的导数。(注:xn(n为整数)的一阶导数为nxn?1。)

输入格式:

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

输出格式:

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

输入样例:

3 4 -5 2 6 1 -2 0

输出样例:

12 3 -10 1 6 0

思路

  1. 开一个数组a[],用来存放对应指数的系数,例如a[e]就是指数为e的项的系数。
  2. 然后使用while.. EOF的格式来读入系数和指数,具体见配套用书2.10.2节。
  3. 从低次项至高次项进行枚举(不能反过来),通过求导公式修改数组a的元素,同时计数不为零的导数项的个数。
  4. 最后从高次项到低次项进行枚举,输出非零项的系数和指数。
  5. 注意点
    1. 经测试,该题的指数都是非负整数,不存在负指数的情况。
    2. 对零次项的求导需要特判其直接为0。
    3. 在求导后,当前系数必须清空为0,否则可能后面无法被覆盖。
    4. 求导部分必须从低次项枚举到高次项,否则结果为出错。关于这点,不妨自己动手模
      拟一下从高次到低次进行枚举的过程。
    5. 如果求导之后没有任何非零项,需要输出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;
} 

思路(柳婼大佬)

分析:

  1. flag?来判断是否已经有过输出~
  2. 当b!=0时,因为给出的是所有?零项系数,所以必定会有输出,先判断flag是否为1,如果为1表示已 经有过输出,那么在前?要先输出?个空格
  3. 输出 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";
}

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

上一篇:【翻译自mos文章】在11gR2 rac环境中,文件系统使用率紧张,并且lsof显示有很多oraagent_oracle.l10 (deleted)


下一篇:leetcode 只出现一次的数字 简单