[Jeremy Wu]群龙的飞行方程(C++)kkmd66

这篇博客介绍了如何解决一种特殊的数学问题——对含有重复变量的飞龙飞行方程进行求导。题目背景设定为龙王阿尔法的魔幻世界,将复杂的数学运算与驯龙高手的故事相结合。题目要求对输入的飞龙飞行方程,如3*x^2+6*y^5+3*z^2等,进行求导,并输出一阶导数的方程式。博客提供了一个C++代码实现,用于解析输入的方程并计算导数。通过这个程序,读者可以学习到如何处理这类数学问题和编程技巧。
摘要由CSDN通过智能技术生成

写在前面

sample output真就离谱!
我想问:3 * Z ^ 0 导数等于3 ?你让3 * Z ^ 1导数等于几 ?
还真能有不少accepted。。。
本文代码正确输出,不能accepted

Description:

由于龙王阿尔法有天然对群龙的意念操控能力,往往阿尔法走到哪,它的周围一圈都会有各种各样的龙绕着它飞行。

驯龙高手讲的是古代维京人的魔幻故事,却暗合了当代人类全球化生存状况的节拍。无论银幕上下,世界和平要依靠年轻一代来努力,都是不言而喻的事实。现在,全球某工商的著名计算机图像学Ph.D想好好研究每只龙的飞行属性。

已知每只龙的飞行方程,可简化为二维平面内的方程。现给出方程,求出求导后的方程形式。不过,调皮的Ph.D 为了让科研过程变得更有趣,他会给出一系列飞龙的飞行方程,其中,可能会存在这样的情况:“x^2+ y^3 + 4* x ^ 2”,也就是说,“x”可能会重复出现,不过不会存在不相同指数的x,详细的输入格式,请参照如下Input。

身为年轻英勇的维京勇士小嗝嗝的你,能帮助我们全球某工商著名计算机图像学Ph.D解答这个问题吗?

Input:

有多组数据测试,以输入 0 结束。

第一行输入一个数字 t ,表示接下来有 t 行输入,分别代表 t 只飞龙的飞行方程。每一行的输入格式如下:“3X 2 6 Y 5 3 Z 2”表示飞行方程:“3x^2+ 6y^5 + 3 * z ^2”,同样,会存在如下的输入:“1X 3 2 X 3 6 Y 2 3 Z 0”表示飞行方程:“3* x ^ 3 + 6 * y ^ 2 + 3 * z ^ 0”。并保证每行相对应的输出为“a* x ^ (n1) + b * y ^ (n2) + c * z ^ (n3)”,输入的各项系数和次数都为0~ 9的数字,以及输入只会有“X”、“Y”和“Z”三个字母。输入一行不会超过2000个字符长度。输入数据均在int范围内。(若出现幂次为0,则视为1。)

Output:

对于每组测试,输出“Case#k: ”,首先,k从1开始标号。

对于每个飞行方程,输出“a* x ^ (n1) + b * y ^ (n2) + c * z ^(n3)”表示求导后的结果。详细参见样例,每行中会存在空格,注意空格的输出控制。

Sample Input:

2
1 X 3 2 X 3 6 Y 2 3 Z 0
3 X 2 6 Y 5 3 Z 2
4
9 X 9 9 X 9 9 X 9 9 X 9 9 X 9
9 X 9 9 Y 9
9 X 9 9 Z 9
9 Y 9 9 Z 9
0

Sample Output:

Case #1:
9 * X ^ 2 + 12 * Y ^ 1 + 3
6 * X ^ 1 + 30 * Y ^ 4 + 6 * Z ^ 1
Case #2:
405 * X ^ 8
81 * X ^ 8 + 81 * Y ^ 8
81 * X ^ 8 + 81 * Z ^ 8
81 * Y ^ 8 + 81 * Z ^ 8

#include <iostream>
#include "vector"
#include "string"

using namespace std;

/**
 * [Jeremy Wu]群龙的飞行方程
 * kkmd66
 * @return
 */

int main() {
    int t;
    int count = 1;

    //判定循环
    while (cin >> t && t != 0) {

        //装填输入
        vector<string> function;
        string str;
        for (int i = 0; i < t + 1; ++i) {
            getline(cin, str);
            function.push_back(str);
        }

        //查找同类项,填充同类项
        vector<vector<int>> x_pos(t);
        vector<vector<int>> y_pos(t);
        vector<vector<int>> z_pos(t);
        for (int i = 0; i < function.size() - 1; ++i) {
            for (int j = 2; j < function[i + 1].size(); j++) {
                if (function[i + 1][j] == 'X') {
                    x_pos[i].push_back(j);
                }
                if (function[i + 1][j] == 'Y') {
                    y_pos[i].push_back(j);
                }
                if (function[i + 1][j] == 'Z') {
                    z_pos[i].push_back(j);
                }
            }
        }

        cout << "Case #" << count << ":" << endl;

        //合并同类项,求导,输出
        //系数
        int x_xishu = 0;
        int y_xishu = 0;
        int z_xishu = 0;
        //阶数
        int x_jieshu = 0;
        int y_jieshu = 0;
        int z_jieshu = 0;
        //合并同类项
        for (int i = 0; i < t; ++i) {
            for (int j = 0; j < x_pos[i].size(); ++j) {
                x_xishu += (function[i + 1][x_pos[i][j] - 2]) - '0';
                if (x_xishu != 0)
                    x_jieshu = (function[i + 1][x_pos[i][j] + 2]) - '0';
            }
            for (int j = 0; j < y_pos[i].size(); ++j) {
                y_xishu += (function[i + 1][y_pos[i][j] - 2]) - '0';
                if (y_xishu != 0) {
                    y_jieshu = (function[i + 1][y_pos[i][j] + 2]) - '0';
                }
            }
            for (int j = 0; j < z_pos[i].size(); ++j) {
                z_xishu += (function[i + 1][z_pos[i][j] - 2]) - '0';
                if (z_xishu != 0) {
                    z_jieshu = (function[i + 1][z_pos[i][j] + 2]) - '0';
                }
            }

            //求导,只有一阶及其以上才可求导,否则直接置零
            if (x_jieshu > 0) {
                x_xishu *= x_jieshu;
                x_jieshu--;
            } else {
                x_jieshu = 0;
                x_xishu = 0;
            }
            if (y_jieshu > 0) {
                y_xishu *= y_jieshu;
                y_jieshu--;
            } else {
                y_jieshu = 0;
                y_xishu = 0;
            }
            if (z_jieshu > 0) {
                z_xishu *= z_jieshu;
                z_jieshu--;
            } else {
                z_jieshu = 0;
                z_xishu = 0;
            }

            //格式输出
            if (x_xishu == 0 && y_xishu != 0 && z_xishu != 0) {
                if (y_jieshu == 0 && z_jieshu == 0) {
                    cout << y_xishu << " + " << z_xishu;
                }
                if (y_jieshu != 0 && z_jieshu != 0) {
                    cout << y_xishu << " * Y ^ " << y_jieshu << " + " << z_xishu << " * Z ^ " << z_jieshu;
                }
                if (y_jieshu == 0 && z_jieshu != 0) {
                    cout << y_xishu << " + " << z_xishu << " * Z ^ " << z_jieshu;
                }
                if (y_jieshu != 0 && z_jieshu == 0) {
                    cout << y_xishu << " * Y ^ " << y_jieshu << " + " << z_xishu;
                }
            }
            if (y_xishu == 0 && x_xishu != 0 && z_xishu != 0) {
                if (x_jieshu != 0 && z_jieshu != 0)
                    cout << x_xishu << " * X ^ " << x_jieshu << " + " << z_xishu << " * Z ^ " << z_jieshu;
                if (x_jieshu != 0 && z_jieshu == 0)
                    cout << x_xishu << " * X ^ " << x_jieshu << " + " << z_xishu;
                if (x_jieshu == 0 && z_jieshu != 0)
                    cout << x_xishu << " + " << z_xishu << " * Z ^ " << z_jieshu;
                if (x_jieshu == 0 && z_jieshu == 0)
                    cout << x_xishu << " + " << z_xishu;
            }
            if (z_xishu == 0 && x_xishu != 0 && y_xishu != 0) {
                if (x_jieshu != 0 && y_jieshu != 0)
                    cout << x_xishu << " * X ^ " << x_jieshu << " + " << y_xishu << " * Y ^ " << y_jieshu;
                if (x_jieshu == 0 && y_jieshu != 0)
                    cout << x_xishu << " + " << y_xishu << " * Y ^ " << y_jieshu;
                if (x_jieshu != 0 && y_jieshu == 0)
                    cout << x_xishu << " * X ^ " << x_jieshu << " + " << y_xishu;
                if (x_jieshu == 0 && y_jieshu == 0)
                    cout << x_xishu << " + " << y_xishu;
            }
            if (x_xishu == 0 && y_xishu == 0 && z_xishu != 0) {
                if (z_jieshu != 0)
                    cout << z_xishu << " * Z ^ " << z_jieshu;
                if (z_jieshu == 0)
                    cout << z_xishu;
            }
            if (x_xishu == 0 && z_xishu == 0 && y_xishu != 0) {
                if (y_jieshu != 0)
                    cout << y_xishu << " * Y ^ " << y_jieshu;
                if (y_jieshu == 0)
                    cout << y_xishu;
            }
            if (x_xishu != 0 && y_xishu == 0 && z_xishu == 0) {
                if (x_jieshu != 0)
                    cout << x_xishu << " * X ^ " << x_jieshu;
                if (x_jieshu == 0)
                    cout << x_xishu;
            }
            if (x_xishu != 0 && y_xishu != 0 && z_xishu != 0) {
                if (x_jieshu != 0 && y_jieshu != 0 && z_jieshu != 0)
                    cout << x_xishu << " * X ^ " << x_jieshu << " + " << y_xishu << " * Y ^ " << y_jieshu << " + "
                         << z_xishu
                         << " * Z ^ " << z_jieshu;
                if (z_jieshu == 0 && y_jieshu != 0 && x_jieshu != 0)
                    cout << x_xishu << " * X ^ " << x_jieshu << " + " << y_xishu << " * Y ^ " << y_jieshu << " + "
                         << z_xishu;
                if (z_jieshu != 0 && y_jieshu == 0 && x_jieshu != 0)
                    cout << x_xishu << " * X ^ " << x_jieshu << " + " << y_xishu << " + "
                         << z_xishu
                         << " * Z ^ " << z_jieshu;
                if (z_jieshu != 0 && y_jieshu != 0 && x_jieshu == 0)
                    cout << x_xishu << " + " << y_xishu << " * Y ^ " << y_jieshu << " + "
                         << z_xishu
                         << " * Z ^ " << z_jieshu;
                if (x_jieshu != 0 && y_jieshu == 0 && z_jieshu == 0)
                    cout << x_xishu << " * X ^ " << x_jieshu << " + " << y_xishu << " + "
                         << z_xishu;
                if (x_jieshu == 0 && y_jieshu != 0 && z_jieshu == 0)
                    cout << x_xishu << " + " << y_xishu << " * Y ^ " << y_jieshu << " + "
                         << z_xishu;
                if (x_jieshu == 0 & y_jieshu == 0 && z_jieshu != 0)
                    cout << x_xishu << " + " << y_xishu << " + "
                         << z_xishu
                         << " * Z ^ " << z_jieshu;
                if (x_jieshu == 0 && y_jieshu == 0 && z_jieshu == 0)
                    cout << x_xishu << " + " << y_xishu << " + "
                         << z_xishu;
            }

            x_xishu = 0;
            y_xishu = 0;
            z_xishu = 0;

            x_jieshu = 0;
            y_jieshu = 0;
            z_jieshu = 0;
            cout << endl;
        }
        count++;
    }

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值