PAT (Basic Level) Practise 1010. 一元多项式求导 (25)

本文介绍如何通过编程实现一元多项式的导数计算,包括两种方法:一种使用链表,另一种则较为简单直接。重点在于理解多项式导数的基本数学原理并将其转化为算法实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

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

输入样例:
3 4 -5 2 6 1 -2 0
输出样例:
12 3 -10 1 6 0

第一种方法使用链表,比较麻烦,主要是练习链表的使用,如果链表用的不好可以做一下训练

#include <stdio.h>    //标准输入输出文件
#include <stdlib.h>   //标准库头文件
#include <iostream>
using namespace std;
typedef int ElemType;
typedef struct Node *LinkList;
typedef struct Node
{
    ElemType coef;     //多项式系数
    ElemType expon;    //多项式指数
    LinkList next;
}Node;
void Attach(int coef,int expon,LinkList *rear)     //将数据存入链表rear指向链表的尾部
{
    LinkList p;
    p=(LinkList)malloc(sizeof(Node));       
    p->coef=coef;
    p->expon=expon;
    p->next = NULL;
    (*rear)->next=p;                        
    *rear=p;
}
LinkList ReadNode()
{
    LinkList q,rear,temp;
    int temp_1,temp_2;
    q=(LinkList)malloc(sizeof(Node));
    rear=q;
    do
    {
        cin>>temp_1>>temp_2;
        Attach(temp_1,temp_2,&rear);
    }while(cin.get() != '\n');
    temp=q;
    q=q->next;
    free(temp);
    return q;
}
LinkList HandleLink(LinkList L)
{
    LinkList L1,L2;
    L2=L;
    L1=NULL;
    while(L2&&L2->expon)
    {
        L2->coef=L2->coef*L2->expon;
        L2->expon--;
        L1=L2;
        L2=L2->next;
    }
    if(L2)                  //如果L2有常数项
    {
        if(L1)              //如果常数项不是唯一的项
        {
            free(L2);
            L1->next=NULL;
        }
        else
        {
            L2->coef=0;
        }
    }
    return L;
}
void PrintLink(LinkList L)
{
    int flag=0;
    int temp_1,temp_2;
    while(L)
    {
        if(!flag)
        {
            flag=1;
        }
        else
        {
            cout<<" ";
        }
        temp_1=L->coef;
        temp_2=L->expon;
        cout<<L->coef<<' '<<L->expon;
        L=L->next;
    }
}
int main()
{
    LinkList Ls;
    Ls=ReadNode();
    Ls=HandleLink(Ls);
    PrintLink(Ls);
    return 0;
}

第二种方法比较简单,也比较好想,主要是0,0的时候注意一下就可以

#include <iostream>
using namespace std;
int main()
{
    int coef,expon;
    int flag = 0;
    do
    {
        cin>>coef>>expon;
        if(expon>0)
            if(flag ==0)
            {
                cout<<coef*expon<<' '<<expon-1;
                flag = 1;
            }
            else
                cout<<' '<<coef*expon<<' '<<expon-1;
        if(flag ==0)
            cout<<"0 0";
    }while(cin.get() != '\n');
    return 0;
} 
内容概要:本文详细介绍了如何利用Simulink进行自动代码生成,在STM32平台上实现带57次谐波抑制功能的霍尔场定向控制(FOC)。首先,文章讲解了所需的软件环境准备,包括MATLAB/Simulink及其硬件支持包的安装。接着,阐述了构建永磁同步电机(PMSM)霍尔FOC控制模型的具体步骤,涵盖电机模型、坐标变换模块(如Clark和Park变换)、PI调节器、SVPWM模块以及用于抑制特定谐波的陷波器的设计。随后,描述了硬件目标配置、代码生成过程中的注意事项,以及生成后的C代码结构。此外,还讨论了霍尔传感器的位置估算、谐波补偿器的实现细节、ADC配置技巧、PWM死区时间和换相逻辑的优化。最后,分享了一些实用的工程集成经验,并推荐了几篇有助于深入了解相关技术和优化控制效果的研究论文。 适合人群:从事电机控制系统开发的技术人员,尤其是那些希望掌握基于Simulink的自动代码生成技术,以提高开发效率和控制精度的专业人士。 使用场景及目标:适用于需要精确控制永磁同步电机的应用场合,特别是在面对高次谐波干扰导致的电流波形失真问题时。通过采用文中提供的解决方案,可以显著改善系统的稳定性和性能,降低噪声水平,提升用户体验。 其他说明:文中不仅提供了详细的理论解释和技术指导,还包括了许多实践经验教训,如霍尔传感器处理、谐波抑制策略的选择、代码生成配置等方面的实际案例。这对于初学者来说是非常宝贵的参考资料。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值