POJ 2809 - It's My Derivative | 模拟

传送门

  • 最高次项和其他项的区别(如果为-0则需要抹掉-)
  • 最高次项正负的差别(若为负数,solve()的调用条件与其他项相同;正数则需要特别处理)
  • 求导结束后是否还有指数(1 0的幂次不作处理)
  • _x, _, _ x ^ _, x ^ _(基本四种之外,还有前面带了+ -的八种)
#include <iostream>
#include <string>
#include <algorithm>
#include <cmath>
using namespace std;

#define MAXN 10000
int n, //式子的个数
    ans, //x的解
    sum,//一阶导数值(加和后
    ttcnt;
string origin,//原函数
       Derivative, //第一次求导结束
       valuein,//用(ans)代替x
       vplus,//算数但不加和
       anscon;

int s2i(string a){
    int len = a.length(), val = 0, tencnt = pow(10.0, len-1);
    for(int i = 0;i < len;i++){
        val += a[i]*tencnt;
        tencnt /= 10;
    }
    return val;
}
string i2s(int a){
    string val;
    int tempa = 0;
    if(a == 0){
        return "0";
    }
    if(a < 0) tempa = 1;
    while(a){
        val += a%10+'0';
        a /= 10;
    }
    if(tempa) val += '-';
    reverse(val.begin(), val.end());
    return val;
}

bool specheck(string a){
    if(a[0] == '-'){
        if(a.length() == 3){//-_x
            cout << "POLYNOMIAL " << ttcnt << endl;
            sum -= (a[1]-'0');
            cout << a << endl << a[0] << a[1] << endl << a[0] << a[1] << endl << a[0] << a[1] << endl << sum << endl;
            return 1;
        }
        else if(a.length() == 2){//-_ || -x
            cout << "POLYNOMIAL " << ttcnt << endl;
            if(a[1] == 'x') cout << a << endl << -1 << endl << -1 << endl << -1 << endl << -1 << endl;
            cout << a << endl << '0' << endl << '0' << endl << '0' << endl << 0 << endl;
            return 1;
        }
    }
    else{//_x   _
        if(a.length() == 1){//_ || x
            cout << "POLYNOMIAL " << ttcnt << endl;
            if(a[0] == 'x') cout << a << endl << 1 << endl << 1 << endl << 1 << endl << 1 << endl;
            else cout << a << endl << '0' << endl << '0' << endl << '0' << endl << 0 << endl;
            return 1;
        }
        else if(a.length() == 2){//_x
            cout << "POLYNOMIAL " << ttcnt << endl;
            sum = (a[0]-'0');
            cout << a << endl << a[0] << endl << a[0] << endl << a[0] << endl << sum << endl;
            return 1;
        }
    }
}

void solve(string a, int check){
    int xishu, zhishu, commona;
    string xishucon, zhishucon;

    if((a[0] >= '0' && a[0] <= '9')||a[0] == 'x') {//是正的最高次项

        xishu = (a[0]>='0' && a[0] <= '9')? a[0]-'0' : 1;//判断是_x 还是x

        if(a[2] == '^' || a[1] == '^'){//有指数 _x^ x^_
            if(a[2] == '^') zhishu = a[3] - '0';
            else zhishu = a[2] - '0';
            xishu *= zhishu, zhishu -= 1, xishucon = i2s(xishu), zhishucon = i2s(zhishu);
            if(zhishu > 1){//求导完依然有指数
                Derivative += xishucon + "x^" + zhishucon;
                valuein += xishucon + "(" + anscon + ")^" + zhishucon;
                commona = xishu*pow(double(ans), zhishu);
                vplus += i2s(commona);
                sum += commona;
            }
            else{//==2
                Derivative += xishucon + 'x';
                valuein += xishucon + "(" + anscon + ")";
                commona = xishu*ans;
                vplus += i2s(commona);
                sum += commona;
            }
        }
        else if(a[1] == 'x'){//_x
            Derivative += a[0];
            valuein += a[0];
            commona = xishu*ans;
            vplus += i2s(commona);
            sum += commona;
        }
        else{//_
            Derivative += '0';
            valuein += '0';
            vplus += '0';
        }
    }

    else{//带符号 其他项
        char sym = a[0];//先把符号存起来 防止-_的情况,求导完是0直接扔掉即可
        int symc = (a[0] == '-')?1:0, temp = 0, commona;//symc=1则为负数

        xishu = (a[1]>='0' && a[1] <= '9')? a[1]-'0' : 1;//判断是_x 还是x

        if(xishu > 1 && a[3] == '^'){//有指数 +_x^_
            zhishu = a[4] - '0', xishu *= zhishu, zhishu -= 1;
            xishucon = i2s(xishu), zhishucon = i2s(zhishu);
            if(zhishu > 1){//求导完依然有指数
                Derivative += sym + xishucon + "x^" + zhishucon;
                valuein += sym + xishucon + "(" + anscon + ")^" + zhishucon;
                commona = xishu*pow(double(ans), zhishu);

                if(!check && commona == 0) vplus += '0';
                else vplus += sym  + i2s(commona);

                temp = commona;
                sum += (symc==1?(temp*(-1)):temp);
            }
            else{//==2 求导完_
                Derivative += sym + xishucon + 'x';
                valuein += sym + xishucon + "(" + anscon + ")";
                commona = xishu*ans;

                if(!check && commona == 0) vplus += '0';
                else vplus += sym  + i2s(commona);

                temp = commona;
                sum += (symc==1?(temp*(-1)):temp);
            }
        }
        else if(xishu == 1 && a[2] == '^'){//+x^_
            zhishu = a[3] - '0', xishu *= zhishu, zhishu -= 1;
            xishucon = i2s(xishu), zhishucon = i2s(zhishu);
            if(zhishu > 1){//求导完依然有指数
                Derivative += sym;
                Derivative += xishucon;
                Derivative += "x^" + zhishucon;
                valuein += sym;
                valuein += xishucon;
                valuein += "(" + anscon + ")^";
                valuein += zhishucon;
                commona = xishu*pow(double(ans), zhishu);
                if(!check && commona == 0) vplus += '0';
                else vplus += sym  + i2s(commona);
                temp = commona;
                sum += (symc==1?(temp*(-1)):temp);
            }
            else{//==2 求导完_
                Derivative += sym;
                Derivative += xishucon;
                Derivative += 'x';
                valuein += sym;
                valuein += xishucon;
                valuein += "(" + anscon + ")";
                commona = xishu*ans;
                if(!check && commona == 0) vplus += '0';
                else vplus += sym  + i2s(commona);
                //vplus += sym;
                //vplus +=i2s(commona);
                temp = commona;
                sum += (symc==1?(temp*(-1)):temp);
            }
        }
        else if(a[2] == 'x'){//+_x 说明系数=1
            Derivative += sym;
            Derivative += a[1];
            valuein += sym;
            valuein += a[1];
            commona = xishu;
            if(!check && commona == 0) vplus += '0';
            else vplus += sym  + i2s(commona);
            //vplus += sym;
            //vplus += i2s(commona);
            temp = commona;
            sum += (symc==1?(temp*(-1)):temp);
        }
        else if(a[1] == 'x'){//+x
            xishu = 1;
            Derivative += sym;
            Derivative += '1';
            valuein += sym;
            valuein += '1';
            if(!check && commona == 0) vplus += '0';
            else vplus += sym  + i2s(commona);
            //vplus += sym;
            //vplus += '1';
            sum += symc==1?-1:1;
        }
        else{//_
            return;
        }
    }
}

int main() {
    scanf("%d", &n);
    for(ttcnt = 1; ttcnt <= n; ttcnt++){
        cin >> ans >> origin;
        string con;
        anscon = i2s(ans), Derivative.clear(),valuein.clear(),vplus.clear(), sum = 0;

        //cout << "!!" <<  ans << "  " << anscon << endl;

        if(specheck(origin)) continue;

        int checkcc = 0;
        for(int iter = 0;iter < origin.length();iter++){//先把多项式按项切割
            if((origin[iter] == '+' || origin[iter] == '-') && iter!=0){
                solve(con, checkcc);
                con.clear();
                con += origin[iter];
                checkcc++;
            }
            else{
                con += origin[iter];
            }
        }

        if(!checkcc){//说明是单项式
            solve(con,checkcc);
        }

        cout << "POLYNOMIAL " << ttcnt << endl;
        cout << origin << endl << Derivative << endl << valuein << endl << vplus << endl << sum << endl;

    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值