C/C++语言 多项式加法和乘法

多项式加法和乘法

  • 多项式的加法
    • 题目描述
    • 输入输出
    • 样例
    • 步骤
    • 代码段
      • 全局变量设定
      • 新建结点
      • 合并链表
    • 完整代码
  • 多项式乘法
    • 题目描述
    • 输入输出
    • 样例
    • 代码段
      • 计算两多项式结果
      • 输入
    • 完整代码

多项式的加法

题目描述

在这里插入图片描述

输入输出

在这里插入图片描述

样例

在这里插入图片描述

步骤

总体思想是用链表来做
① 我们发现输入样例中,系数和指数是分开输入的。也就是说,输入系数的时候,我们并不知道他对应的指数是多少。因此,我们先定义一个两个数组,一个放系数,一个放指数,然后转换为结点(用结构体,存放每一项的系数和指数),放进链表。

②输入第二个多项式的时候,要在合适的地方插入链表

  • 如果遍历到指数相同的节点,则指数相加,不建立新的节点
  • 如果遍历到第一个指数比自己大的节点,则插入到这个节点之前
  • 如果直接遍历到链表尾端了,那就插在最后

代码段

全局变量设定

typedef struct node{//存放系数和指数
    ll ind;
    ll exp;
    struct node* next;
}NODE;
NODE* head;//合并之后链表的头结点
int n,m;//多项式1和2的长度
ll ret;//记录系数非零的节点数目

注意一点,因为是多组数据输入,因此每一次都要确保全局变量ret清零

新建结点

NODE* createNode(ll i,ll e){
    NODE* newnode = (NODE*)malloc(sizeof(NODE));
    newnode->ind=i;
    newnode->exp=e;
    newnode->next=NULL;
    return newnode;
}

用于合并两个链表时使用

合并链表

合并两个有序链表是非常经典的链表算法,这里我传的参数并不是链表,但是也是用到了合并链表的思想

void merge(ll* ind1,ll*exp1,ll*ind2,ll*exp2){
    NODE* tail = head;
    int i1 =0;
    int i2=0;//i1和i2分别记录两个多项式的当前最后一位
    while(i1!=n&&i2!=m){
        if(exp1[i1]>exp2[i2]){
            NODE* new = createNode(ind2[i2],exp2[i2]);
            tail->next = new;
            i2++;
        }else if(exp1[i1]<exp2[i2]){
            NODE* new = createNode(ind1[i1],exp1[i1]);
            tail->next = new;
            i1++;
        }else{
            NODE* new = createNode(ind1[i1]+ind2[i2],exp1[i1]);
            tail->next = new;
            i1++;
            i2++;
        }
        tail=tail->next;
        ret++;
    }
    while(i1!=n){
        NODE* new = createNode(ind1[i1],exp1[i1]);
        tail->next = new;
        i1++;ret++;
        tail=tail->next;
    }
    while(i2!=m){
        NODE* new = createNode(ind2[i2],exp2[i2]);
        tail->next = new;
        i2++;ret++;
        tail=tail->next;
    }
}

完整代码

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
#include<stdbool.h>
#include<time.h>
#include<limits.h>
typedef long long ll;
#define MAX_N 100005
#define max(x,y) ((x)>(y)?(x):(y))
#define min(x,y) ((x)<(y)?(x):(y))
typedef struct node{//存放系数和指数
    ll ind;
    ll exp;
    struct node* next;
}NODE;
NODE* head;
int n,m;
ll ret;//记录系数非零的节点数目
NODE* createNode(ll i,ll e){
    NODE* newnode = (NODE*)malloc(sizeof(NODE));
    newnode->ind=i;
    newnode->exp=e;
    newnode->next=NULL;
    return newnode;
}
void merge(ll* ind1,ll*exp1,ll*ind2,ll*exp2){
    NODE* tail = head;
    int i1 =0;
    int i2=0;//i1和i2分别记录两个多项式的当前最后一位
    while(i1!=n&&i2!=m){
        if(exp1[i1]>exp2[i2]){
            NODE* new = createNode(ind2[i2],exp2[i2]);
            tail->next = new;
            i2++;
        }else if(exp1[i1]<exp2[i2]){
            NODE* new = createNode(ind1[i1],exp1[i1]);
            tail->next = new;
            i1++;
        }else{
            NODE* new = createNode(ind1[i1]+ind2[i2],exp1[i1]);
            tail->next = new;
            i1++;
            i2++;
        }
        tail=tail->next;
        ret++;
    }
    while(i1!=n){
        NODE* new = createNode(ind1[i1],exp1[i1]);
        tail->next = new;
        i1++;ret++;
        tail=tail->next;
    }
    while(i2!=m){
        NODE* new = createNode(ind2[i2],exp2[i2]);
        tail->next = new;
        i2++;ret++;
        tail=tail->next;
    }
}
int main(){
    //初始化链表头结点,作为哑结点
    head  =(NODE*)malloc(sizeof(NODE));
    head->ind=head->exp=-1;
    head->next=NULL;
    
    int t;
    scanf("%d",&t);
    while(t--){
        ret=0;
        scanf("%d",&n);
        ll arr1_ind[n];//存放第一个多项式的系数
        for(int i=0;i<n;i++){
            scanf("%lld",&arr1_ind[i]);
        }

        ll arr1_exp[n];//存放第一个多项式的指数
        for(int i=0;i<n;i++){
            scanf("%lld",&arr1_exp[i]);
        }

    
        scanf("%d",&m);
        ll arr2_ind[m];//存放第二个多项式的系数
        for(int i=0;i<m;i++){
            scanf("%lld",&arr2_ind[i]);
        }

        ll arr2_exp[m];//存放第二个多项式的指数
        for(int i=0;i<m;i++){
            scanf("%lld",&arr2_exp[i]);
        }
        
        //合并两个多项式
        merge(arr1_ind,arr1_exp,arr2_ind,arr2_exp);

        
        //输出最后合并的结果
        printf("%lld\n",ret);

        NODE* cur = head->next;
        while(cur!=NULL){
            printf("%lld ",cur->ind);
            cur = cur->next;
        }
        printf("\n");
        cur = head->next;
        while(cur!=NULL){
            printf("%lld ",cur->exp);
            cur = cur->next;
        }
        printf("\n");
    }
    return 0;
}

多项式乘法

题目描述

在这里插入图片描述

输入输出

在这里插入图片描述

样例

在这里插入图片描述

代码段

计算两多项式结果

ll cal(ll base1,ll base2,ll* a,ll* b){
    ll ret1 = 0;
    ll x=1;
    for(int i=0;i<=n;i++){
        ret1=(ret1%MOD+x*a[i]%MOD)%MOD;
        x=(x*base1)%MOD;
    }

    ll ret2 = 0;
    x=1;
    for(int i=0;i<=m;i++){
        ret2=(ret2%MOD+x*b[i]%MOD)%MOD;
        x=(x*base2)%MOD;
    }
    return (ret1*ret2)%MOD;
}

注意取模的规则

输入

cin>>n;
    ll a[n+1];//注意要多开辟一个空间
    for(int i=0;i<=n;i++){
        cin>>a[i];
    }

    cin>>m;
    ll b[m+1];
    for(int i=0;i<=m;i++){
        cin>>b[i];
    }

两个系数数组都要记得多开辟一个空间,因为n和m代表最高次数,1-n次再加上一个0次,一共需要n+1个空间

完整代码

#include <iostream>
using namespace std;
#define MOD 10007
typedef long long ll;
int n,m,q;
ll cal(ll base1,ll base2,ll* a,ll* b){
    ll ret1 = 0;
    ll x=1;
    for(int i=0;i<=n;i++){
        ret1=(ret1%MOD+x*a[i]%MOD)%MOD;
        x=(x*base1)%MOD;
    }

    ll ret2 = 0;
    x=1;
    for(int i=0;i<=m;i++){
        ret2=(ret2%MOD+x*b[i]%MOD)%MOD;
        x=(x*base2)%MOD;
    }
    return (ret1*ret2)%MOD;
}
int main(){
    cin>>n;
    ll a[n+1];
    for(int i=0;i<=n;i++){
        cin>>a[i];
    }

    cin>>m;
    ll b[m+1];
    for(int i=0;i<=m;i++){
        cin>>b[i];
    }

    cin>>q;
    for(int i=0;i<q;i++){
        ll base1,base2;
        cin>>base1>>base2;
        cout<<cal(base1,base2,a,b)<<endl;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/915659.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ArkTs面向对象编程

ArkTs面向对象编程 1.1 面向对象编程概述 1.1.1 什么是面向对象编程 面向对象编程是一种编程范式&#xff0c;它使用“对象”来设计软件和创建可重用的程序设计 对象是包含数据和方法的实体&#xff0c;可以与其他对象进行交互 面相对象编程鼓励使用已有的对象来组合或修改以…

乳腺癌诊断分析——基于聚类分析实现

一、研究背景 乳腺癌属于恶性肿瘤&#xff0c;在早期发现后需要及早将病变组织切除&#xff0c;而且术后还要化疗和放射等辅助治疗&#xff0c;能够抑制癌细胞的扩散和增长。 二、研究目的 研究乳腺癌病人的患病特征通过聚类分析方法对特征进行分类通过上述聚类结果对乳腺诊…

丹摩征文活动|FLUX.1 和 ComfyUI:从部署到上手,轻松驾驭!

FLUX.1 和 ComfyUI&#xff1a;从部署到上手&#xff0c;轻松驾驭&#xff01; FLUX.1历史曲线 黑森林实验室推出了一款名为FLUX.1的先进图像生成模型&#xff0c;根据不同用户需求&#xff0c;提供了三种独特的版本。 FLUX.1-pro&#xff1a;作为专为企业打造的强大闭源版本…

数据分析:16s差异分析DESeq2 | Corncob | MaAsLin2 | ALDEx2

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍DESeq2原理计算步骤结果Corncob原理计算步骤结果MaAsLin2原理计算步骤结果ALDEx2原理计算步骤结果加载R包数据链接数据预处理微生物数据样本信息提取物种名称过滤零值保留结果读取…

OCR识别铁路电子客票

随着中国铁路客运领域进入全面数字化时代&#xff0c;国家税务总局、财政部和国铁集团于2024年10月18日联合发布公告&#xff0c;自2024年11月1日起&#xff0c;推广使用“电子发票&#xff08;铁路电子客票&#xff09;”。这一举措不仅为旅客出行提供了极大的便利&#xff0c…

【MySQL基础刷题】总结题型(三)

十题左右&#xff0c;便于复习 1.查询结果的质量和占比2.每月交易I3.销售分析III4.只出现一次的最大数字5.买下所有产品的客户6.员工的直属部门7.指定日期的产品价格 1.查询结果的质量和占比 avg大神啊… SELECT query_name, ROUND(avg(rating / position), 2) as quality, …

python 同时控制多部手机

在这个智能时代,我们的手机早已成为生活和工作中不可或缺的工具。无论是管理多个社交媒体账号,还是处理多台设备上的事务,如何更高效地控制多个手机成为了每个人的痛点。 今天带来的这个的软件为你提供了一键控制多部手机的强大功能。无论是办公、娱乐,还是社交,你都能通过…

外星人入侵

学习于Python编程从入门到实践&#xff08;Eric Matthes 著&#xff09; 整体目录&#xff1a;外星人入侵文件夹是打包后的不必在意 图片和音效都是网上下载的 音效下载网站&#xff1a;Free 游戏爆击中 Sound Effects Download - Pixabay 运行效果&#xff1a;可以上下左右移…

前端监控与埋点 全总结

一、概念 前端埋点是指在网页或者应用程序中插入特定的代码&#xff0c;用于收集用户的行为数据并发送给服务器进行分析。这些数据可以包括用户的点击、浏览、输入等操作&#xff0c;帮助开发者了解用户的在其网站中的行为&#xff0c;从而进行针对性的优化和改进。 前端埋点…

Python简单文件操作day9

1、文件操作的重要性和场景 重要性&#xff1a; 数据持久化、跨平台兼容性、数据备份与恢复、数据共享、配置管理、日志记录 应用场景&#xff1a; 数据分析、web开发、文本处理 2、文件的概念 文件是一个存储在某种持久性存储介质【硬盘、光盘、磁盘等】上的数据的结合。 …

指令存储和指令流水线

要求存储器的编址单位&#xff0c;首先观察到计算机采用的是32位定长指令字&#xff0c;因此一条指令就是32位&#xff0c;即4B&#xff0c;根据表中可知一条指令所占地址空间为08048104H-08048100H4H&#xff0c;因此所用的编制单位为字节&#xff08;B&#xff09; 将所有指令…

kafka管理工具

文章目录 前言一、Kafka Assistan1.1 描述1.2、配置安装 二、Conduktor2.1、描述2.2、配置安装 三、kafka-maneger3.1、描述3.2、配置安装3.3、命令启动3.4、[refer to](https://www.ctyun.cn/document/10000120/10033218#section-39755766f4910e4b) 前言 提示&#xff1a;这里…

JavaWeb常见注解

1.Controller 在 JavaWeb 开发中&#xff0c;Controller是 Spring 框架中的一个注解&#xff0c;主要用于定义控制器类&#xff08;Controller&#xff09;&#xff0c;是 Spring MVC 模式的核心组件之一。它表示该类是一个 Spring MVC 控制器&#xff0c;用来处理 HTTP 请求并…

axios平替!用浏览器自带的fetch处理AJAX(兼容表单/JSON/文件上传)

fetch 是啥&#xff1f; fetch 函数是 JavaScript 中用于发送网络请求的内置 API&#xff0c;可以替代传统的 XMLHttpRequest。它可以发送 HTTP 请求&#xff08;如 GET、POST 等&#xff09;&#xff0c;并返回一个 Promise&#xff0c;从而简化异步操作 基本用法 /* 下面是…

window任务计划记录中显示操作成功,但是代码只执行了第一句命令

一、创建定时任务 1. Windows键R 调出此窗口&#xff0c;输入compmgmt.msc &#xff08;调用的是计算机管理&#xff09; 2. 创建基本任务 在任务计划程序中右键 选择 创建基本任务。 输入任务名称及描述。 下一步中选择触发器的时间&#xff0c;这里选择每天。 选择开始时间&…

使用VSCode远程连接服务器并解决Neo4j无法登陆问题

摘要&#xff1a;本文介绍了如何通过VSCode连接内网部署的Neo4j服务器&#xff0c;并启动服务。在访问Neo4j登录界面时&#xff0c;遇到了端口映射问题导致无法登录。通过手动添加7687端口的映射后&#xff0c;成功登录Neo4j。 我在内网部署了一台服务器&#xff0c;并在其上运…

【异常解决】Linux shell报错:-bash: [: ==: 期待一元表达式 解决方法

博主介绍&#xff1a;✌全网粉丝21W&#xff0c;CSDN博客专家、Java领域优质创作者&#xff0c;掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围&#xff1a;SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…

游戏引擎学习第四天

视频参考:https://www.bilibili.com/video/BV1aDmqYnEnc/ BitBlt 是 Windows GDI&#xff08;图形设备接口&#xff09;中的一个函数&#xff0c;用于在设备上下文&#xff08;device context, DC&#xff09;之间复制位图数据。BitBlt 的主要用途是将一个图像区域从一个地方复…

七牛云上传图片成功,但是无法访问显示{error : document not found}

上传图片成功&#xff0c;但是访问不了的问题&#xff0c;直接把地址放进浏览器显示{error : document not found}&#xff0c;直接访问 DCNF 404是符合预期的&#xff0c;因为还没有去空间复制外链&#xff0c;要访问实际存在的资源才可以的. 配置区域和访问域名 设置没问题了…

通过投毒Bingbot索引挖掘必应中的存储型XSS

简介 在本文中&#xff0c;我将讨论如何通过从外部网站对Bingbot进行投毒&#xff0c;来在Bing.com上实现持久性XSS攻击。 什么是存储型或持久性XSS&#xff1f;存储型攻击指的是将恶意脚本永久存储在目标服务器上&#xff0c;例如数据库、论坛、访问日志、评论栏等。受害者在…