首页 > 代码库 > 一元多项式求导

一元多项式求导

/* 一元多项式求导 (25)

设计函数求一元多项式的导数。

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

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

输入样例:
3 4 -5 2 6 1 -2 0  即 3X^4 - 5X^2 + 6X - 2

输出样例:
12 3 -10 1 6 0     即 12X^3 - 10X + 6 - 0

导数:
aX^n 的导数为 a*nX^(n-1),在本题中即输出 a*n n-1
常数的导数为 0

*/
#pragma once

#include<vector>
#include<sstream>
#include<iostream>
#include<string>
using namespace std;

struct Item
{
    int e;
    int n;  
};

void Input(vector<Item>&vec)
{
    string line;
    Item it;
    int num;
    bool bN = true;
    getline(cin, line, '\n');
    istringstream stream(line);
    while(stream >> num)
    {
        static int i = 0;
        if(bN)
            it.n = num;
        else
            it.e = num;

        if(++i%2==0)
            vec.push_back(it);

        bN = !bN;
    }
}

// 合并同类顶
void Comb(vector<Item>&a, vector<Item>&b)
{
    int size = a.size();
    int i;

    for(i = 0; i < size-1; ++i)
    {
        if(a[i].e == a[i + 1].e)
        {
            a[i+1].n += a[i].n;
        }
        else
        {
            if(a[i].n != 0)
                b.push_back(a[i]);
        }
            
    }

    // 最后漏掉的一个
    if( a[i].n != 0)
        b.push_back(a[i]);
}

void Output(vector<Item>&vec)
{
    int size = vec.size();

    if( (size == 1 && vec[0].e == 0 && vec[0].n==0) || size == 0)
    {
        cout << "0 0" << endl;
        return;
    }

    for(int i = 0; i < size; ++i)
    {
        if(vec[i].e == 0)
            cout << '0';
        else if(vec[i].e - 1 == 0)
            cout << vec[i].n;
        else 
        {
            cout << vec[i].n * vec[i].e << ' ';
            cout << vec[i].e - 1;
        }
            

        if(i != size - 1)
            cout << ' ';
    }
    cout << endl;
}


void Run()
{
    vector<Item>vec, der;
    Input(vec);
    Comb(vec, der);
    Output(der);
}

int main(void)
{
    Run();
    return 0;
}

一元多项式求导