一元多项式的乘法运算(C语言)实现

article/2025/8/15 7:21:28

[PAT] 一元多项式的乘法与加法运算 C语言实现

[PAT] 02-线性结构1 一元多项式的乘法与加法运算

设计函数分别求两个一元多项式的乘积与和。

输入格式:

输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。

输出格式:

输出分2行,分别以指数递降方式输出乘积多项式以及和多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。零多项式应输出0 0

输入样例:

4 3 4 -5 2  6 1  -2 0
3 5 20  -7 4  3 1

输出样例:

15 24 -25 22 30 21 -10 20 -21 8 35 6 -33 5 14 4 -15 3 18 2 -6 1
5 20 -4 4 -5 2 9 1 -2 0

  • 时间限制:200ms
  • 内存限制:64MB
  • 代码长度限制:16kB
  • 判题程序:系统默认
  • 作者:DS课程组
  • 单位:浙江大学

  原题点击此处

  好的,宝宝又来写东西啦~这次的题目是一道多项式计算题:输入两个多项式,输出他们的乘积与和,格式大概是这样:

  [15 24] [-25 22] [30 21] [-10 20]...

   每个中括号前面的是系数,后面的是指数,排序是指数从高到低.

 

  这题难度本身不大,做出来很容易.但是要追求速度和更少内存消耗的话还是需要考虑用什么方式去储存和处理这些数据,下面给出我个人的一个方法:求乘积用双向链表,求和用动态数组.另外,我的代码比较长,因为我采用的是"空间换时间"的总体方向,所以消耗较多储存空间,好处是不用递归函数,那个是计算机最不擅长的事情.

复制代码
#include <stdio.h>
#include <stdlib.h>typedef struct 
{int cofe;int expo;
} NODE;typedef struct _List
{int cofe;int expo;  struct _List * _next;struct _List * _back;        
} List;
复制代码

  构造一个NODE型的struct.存放原始每一项的系数(cofe)和指数(expo),再构造一个List型的struct,这是一个可以增长的链表,在原始数据里面不断抽取数据按指数大小进行比较排序,若指数比当前指的小就向后(左)移动一位,比当前大就向后(右)移动一位如果已经指到头则新建一个节点再写入,这其中的判断逻辑还包括系数相乘后写入系数区,排序结束后的双向链表就可以直接输出了.


复制代码
 1 int main(void) //全局初始化,包括建立各种变量以及读入原始数据
 2 {
 3     int PolyOneCount,PolyTwoCount,i,k,cofe_temp,expo_temp,flag=1,Once=1,NotZeroCount=0;
 4     NODE* PolyOne=NULL;
 5     NODE* PolyTwo=NULL;
 6     List* PL=NULL;
 7     NODE* PolySum=NULL;
 8     List* PTemp;
 9     NODE* P1=NULL;
10     NODE* P2=NULL;
11     scanf("%d",&PolyOneCount);
12     P1=PolyOne=(NODE*)malloc(PolyOneCount*sizeof(NODE));
13     for ( i=0; i<PolyOneCount; i++ ) 
14     {
15         scanf("%d",&((PolyOne+i)->cofe));
16         scanf("%d",&((PolyOne+i)->expo));
17     }
18     scanf("%d",&PolyTwoCount);
19     P2=PolyTwo=(NODE*)malloc(PolyTwoCount*sizeof(NODE));
20     for ( i=0; i<PolyTwoCount; i++ )
21     {
22         scanf("%d",&((PolyTwo+i)->cofe));
23         scanf("%d",&((PolyTwo+i)->expo));
24     }
25     List* PC=(List*)calloc(1,sizeof(List)); //PC是游走的指针,相当于一个爪子,把元素送到它需要去的地方
复制代码

  全局初始化,包括建立各种变量以及读入原始数据.  


复制代码
  1 for (i=0; i<PolyOneCount; i++) 
  2     for (k=0; k<PolyTwoCount; k++)
  3         {
  4         cofe_temp=((PolyOne+i)->cofe)*((PolyTwo+k)->cofe);
  5         expo_temp=((PolyOne+i)->expo)+((PolyTwo+k)->expo);
  6             while (1)
  7             {
  8                 if (Once)
  9                 {
 10                     PC->cofe = cofe_temp;
 11                     PC->expo = expo_temp;
 12                     PL=PC;
 13                     Once=0;
 14                     break;
 15                 } 
 16                      
 17                  
 18                 if (expo_temp > PC->expo) //元素需要后移 
 19                 {
 20                     if (PC->_next) //链表存在下一节点 
 21                     {
 22                         flag=1;
 23                         if (expo_temp > (PC->_next)->expo) //尚未到位 
 24                             PC=PC->_next;
 25                         else if (expo_temp < (PC->_next)->expo) //已到位 
 26                         {
 27                             PTemp = (List*)calloc(1,sizeof(List));
 28                             PTemp->_next = (PC->_next); 
 29                             (PC->_next)->_back = PTemp;
 30                             PC->_next = PTemp;
 31                             PTemp->_back = PC;
 32                             PC=PC->_next;
 33                             PC->cofe = cofe_temp;
 34                             PC->expo = expo_temp;
 35                             break;
 36                         }
 37                         else if (expo_temp == (PC->_next)->expo) //元素与下一个相等 
 38                         {
 39                             PC=PC->_next;
 40                             (PC->cofe)+=cofe_temp;
 41                             flag=0;
 42                             break;
 43                         }
 44                     }
 45                      
 46                     else //双向链表无下一节点. 
 47                     {
 48                         PTemp = (List*)calloc(1,sizeof(List));
 49                         PTemp->_back = PC;
 50                         PL=PTemp;
 51                         PC->_next = PTemp;
 52                         PC=PC->_next;
 53                         PC->cofe = cofe_temp;
 54                         PC->expo = expo_temp;
 55                          
 56                         break;
 57                     }                           
 58                 }
 59                  
 60                 else if (expo_temp < PC->expo) //元素需要前移 
 61                 {
 62                     if (PC->_back) //存在前驱节点 
 63                     {
 64                         flag=1;
 65                         if (expo_temp < (PC->_back)->expo) //未到位 
 66                             PC=PC->_back;
 67                         else if (expo_temp > (PC->_back)->expo) //已到位 
 68                         {
 69                             PTemp = (List*)calloc(1,sizeof(List));
 70                             PTemp->_back = (PC->_back); 
 71                             (PC->_back)->_next = PTemp;
 72                             PC->_back = PTemp;
 73                             PTemp->_next = PC;
 74                             PC=PC->_back;
 75                             PC->cofe = cofe_temp;
 76                             PC->expo = expo_temp;
 77                             break;
 78                         }
 79                         else if (expo_temp == (PC->_back)->expo)
 80                         {
 81                             PC=PC->_back;
 82                             (PC->cofe)+=cofe_temp;
 83                             flag=0;
 84                         }
 85                     } 
 86                     else //不存在前驱节点 
 87                     {
 88                         PTemp = (List*)calloc(1,sizeof(List));
 89                         PTemp->_next = PC;
 90                     //  PH=PTemp;
 91                         PC->_back = PTemp;
 92                         PC=PC->_back;
 93                         PC->cofe = cofe_temp;
 94                         PC->expo = expo_temp;
 95                         break;
 96                          
 97                     }
 98                 }       
 99              
100                 else 
101                 {
102                     if (flag) (PC->cofe)+=cofe_temp;
103                     break;
104                 }
105             }
106         }
107  PC=PL;
复制代码

  以上是乘积计算代码,Once是一个标志,用来创建第一个节点.两个for循环用来遍历所有的乘积组合,当然也是这个程序中时间复杂度最高的一段代码,达到了O(N2).


复制代码
 1    for (;PC;PC=PC->_back)  
 2     {
 3         if (PC->_back != NULL) 
 4         {
 5             if (PC->cofe) 
 6             {
 7                 printf("%d %d ",PC->cofe,PC->expo);
 8                 NotZeroCount++;
 9             } 
10             else continue;
11         }
12         else 
13         {
14             printf("%d %d\n",PC->cofe,PC->expo);
15             NotZeroCount++;
16         }
17     }
18     if (!NotZeroCount) printf("0 0\n");
19     NotZeroCount=0;
复制代码

  输出语句,中间有个if是因为题目要求最后一个不带空格;最后一个判断是看看是否是零多项式,如果是就输出"0 0"(题目要求)


复制代码
 1 int max = 0,Lowest = 0;
 2     if ( PolyOne->expo >= PolyTwo->expo ) max = PolyOne->expo;
 3     else max = PolyTwo->expo;
 4     PolySum=(NODE*)calloc(max+1,sizeof(NODE));
 5     i=k=0;
 6     for (i=0;i<PolyOneCount;i++) 
 7     {
 8         (PolySum+((PolyOne+i)->expo))->cofe += (PolyOne+i)->cofe;
 9         (PolySum+((PolyOne+i)->expo))->expo = (PolyOne+i)->expo;
10     }
11     for (i=0;i<PolyTwoCount;i++) 
12     {
13         (PolySum+((PolyTwo+i)->expo))->cofe += (PolyTwo+i)->cofe;
14         (PolySum+((PolyTwo+i)->expo))->expo = (PolyTwo+i)->expo;
15          
16     }
17        NotZeroCount=0;
18     for (i=0;i<=max;i++)
19     {
20         if( (PolySum+i)->cofe ) 
21         {
22             NotZeroCount=1;
23             Lowest=i;
24             break;
25         }
26     }
27     if (!NotZeroCount) printf("0 0");
28     else
29     for (k=max;k>=0;k--)  
30     if ((PolySum+k)->cofe != 0) 
31     {
32         
33         if (k==Lowest) printf("%d %d",(PolySum+k)->cofe,(PolySum+k)->expo);    
34         else  printf("%d %d ",(PolySum+k)->cofe,(PolySum+k)->expo);
35    
36     }
37     return 0;
38 }//这里没有写free,因为做题时追求速度就省略了这一步,但是大家应当养成"一个malloc一个free"的好习惯
复制代码

  这里是加法的处理,直接给一个NODE型数组,其大小取两个多项式中最大指数加一为数组大小.毕竟相加的指数最大值不超过单个指数的最大值,于是数组的下标就是对应指数的存放地址啦.这里不需要考虑太多,直接连续把两个多项式加到新建的数组上,加完以后用一个for检查系数是不是全是0,如果不是,再用一个for从高指数往低指数输出所有系数非0的一组数据,就此完成~

 



http://chatgpt.dhexx.cn/article/fFNm6GkV.shtml

相关文章

一元多项式相乘

题目说明&#xff1a; 要求采用链表形式&#xff0c;求两个一元多项式的乘积&#xff1a;h3 h1*h2。函数原型为&#xff1a;void multiplication( NODE * h1, NODE * h2, NODE * h3 )。 输入&#xff1a; 输入数据为两行&#xff0c;分别表示两个一元多项式。每个一元多项式以…

多项式加法

多项式加法&#xff08;5分&#xff09; 题目内容&#xff1a; 一个多项式可以表达为x的各次幂与系数乘积的和&#xff0c;比如&#xff1a; 2x63x512x36x20 现在&#xff0c;你的程序要读入两个多项式&#xff0c;然后输出这两个多项式的和&#xff0c;也就是把对应的幂上…

【学习笔记】多项式乘法

文章目录 前置知识&#xff1a;复数引子&#xff1a;虚数定义计算性质 有关多项式点值多项式相乘大整数乘法 FFT \textit{FFT} FFT离散傅里叶变换快速傅里叶变换代码实现蝴蝶变换计算 ω n − x \omega_n^{-x} ωn−x​代码壹号 改进方案精度提升常数优化&#xff1a;二合一常…

多项式除法

多项式除法 应用场景 多项式的因式分解 使用 先试出有理根 r 多项式对线性因子 x - r 做多项式除法&#xff0c;逐步降低次数。 整除 : 结果就是商与被除数的乘积不整除 : 结果是商与余数/被除数的和 只到二次多项式&#xff0c;再利用十字相乘法或求根公式&#xff0c;即…

C语言 多项式乘法 算法

多项式乘法 什么是多项式&#xff1f; 由若干个单项式相加组成的代数式叫做多项式&#xff08;若有减法&#xff1a;减一个数等于加上它的相反数&#xff09;。 多项式中的每个单项式叫做多项式的项&#xff0c;这些单项式中的最高项次数&#xff0c;就是这个多项式的次数。 多…

多项式乘法入门

多项式乘法入门 By SemiWaker 这是一篇蒟蒻对FFT、DFT、CZT、NTT的弱鸡理解 多项式 a0xa1x1a2x2⋯an−1xn−1 上面的这个形式叫做多项式。 系数&#xff1a; a0..n−1 项&#xff1a; aixi 界&#xff1a;n 为了方便我们系数序列就可以表示多项式。 线性卷积 AB∑i02n−2(∑…

一元多项式的乘法与加法运算

题目要求 设计函数分别求两个一元多项式的乘积与和。 输入格式: 输入分2行&#xff0c;每行分别先给出多项式非零项的个数&#xff0c;再以指数递降方式输入一个多项式非零项系数和指数&#xff08;绝对值均为不超过1000的整数&#xff09;。数字间以空格分隔。 输出格式: 输…

多项式乘法运算初级版

快速傅里叶变换在信息学竞赛中主要用于求卷积&#xff0c;或者说多项式乘法。我们知道&#xff0c;多项式乘法的普通算法时间复杂度 是&#xff0c;通过快速傅里叶变换可以使时间降为&#xff0c;那么接下来会详细介绍快速傅里叶变换的原理。 首先来介绍多项式的两种表示方法&…

FFT与多项式乘法

网上关于FFT在信号处理中应用的文章并不少&#xff0c;这里尽量少说废话&#xff0c;直接说如何用FFT实现多项式乘法。 多项式乘法&#xff0c;通常是用系数乘积的方式完成&#xff0c;这样的时间复杂度是O(n^2) n为多项式项数。系数乘法可以满足大多数的乘法需求&#xff0c;然…

多项式乘法

实验题目&#xff1a;多项式乘法问题 实验内容与要求 一元稀疏多项式简单计算器的基本功能是&#xff1a; &#xff08;1)输入并建立多项式。&#xff1b; &#xff08;2&#xff09;输出多项式&#xff0c;输出形式为整数序列&#xff1a;n,c1,e1,c2,e2,…,cn,en,其中n是多项…

多项式乘法运算终极版

在上一篇文章中 http://blog.csdn.net/acdreamers/article/details/39005227 介绍了用快速傅里叶变 换来求多项式的乘法。可以发现它是利用了单位复根的特殊性质&#xff0c;大大减少了运算&#xff0c;但是这种做法是对复数系数的矩阵 加以处理&#xff0c;每个复数系数的实…

多项式乘法(FFT)

1 前言 作为一名OI选手&#xff0c;至今未写过fft相关的博客&#xff0c;真是一大遗憾&#xff0c;这也导致我并没有真正推过fft的所有式子 这一篇fft的博客我将详细介绍多项式乘法&#xff0c;易于理解&#xff0c;主要是为了等我啥时候忘了回来看&#xff0c;当然&#xff0…

分治算法-03多项式乘法问题

多项式乘法 简介 多项式的运算表示是一个很常见的算法问题。 问题描述 给予两个多项式A(x)与B(x)&#xff0c;得出C(x)A(x)B(x)。例如&#xff0c;A(x)32x3x24x3&#xff0c;B(x)2x2&#xff0c;C(x)64x9x210x33x44x^5。 问题分析 一般情况下&#xff0c;使用系数表示多项式&a…

【数据结构】——多项式乘法

题目要求 从字符文件输入两个多项式的非零系数及对应的指数&#xff0c;建立多项式的链式存储结构&#xff0c;计算这两个多项式的乘积&#xff0c;输出乘积多项式的全部非零系数及对应的指数到另一字符文件中。 算法原理 两个多项式的乘法&#xff0c;可以借助两个多项式的…

多项式乘法(FFT)详解

本文只探讨多项式乘法(FFT)在信息学中的应用 如有错误或不明欢迎指出或提问&#xff0c;在此不胜感激 多项式 1. 系数表示法 一般应用最广泛的表示方式 用A(x)表示一个x-1次多项式&#xff0c;a[i]为 xi x i 的系数&#xff0c;则A(x) ∑n−10 ∑ 0 n − 1 a[i] * xi x i…

2.2 多项式乘法与加法运算(线性结构,C)

多项式乘法与加法运算 设计函数分别求两个一元多项式的乘积与和题意理解题意理解和积 求解思路多项式表示两种表示方式在事先已经知道具体多少项的时候&#xff0c;本题较好的实现方法&#xff1a;动态数组链表表示多项式的方法 程序框架如何读入多项式读入多项式的完整程序 加…

多项式乘法问题

多项式乘法问题 实验目的&#xff1a;设计一个一元稀疏多项式简单计算器。 实验内容与要求&#xff1a; 一元稀疏多项式简单计算器的基本功能是&#xff1a; &#xff08;1&#xff09;输入并建立多项式&#xff1b; &#xff08;2&#xff09;输出多项式&#xff0c;序列…

网络协议之视频直播核心技术讲解

网络视频直播存在已有很长一段时间&#xff0c;随着移动上下行带宽提升及资费的下调&#xff0c;视频直播被赋予了更多娱乐和社交的属性&#xff0c;人们享受随时随地进行直播和观看&#xff0c;直播的打开时间和延迟变成了影响产品功能发展重要指标。 那么&#xff0c;问题来了…

直播软件搭建技术原理:CDN 与直播

直播软件搭建技术原理&#xff1a;CDN 与直播 很多直播都是基于 CDN 来实现的。而通过声网的服务&#xff0c;或基于声网SDK与 CDN 结合&#xff0c;还可以实现在直播中的连麦互动、白板同步等强调实时性的场景。本文源自社区投稿&#xff0c;介绍了该场景下的一些基础知识。如…

暑期实习+秋招面经合集(更新ing)

大纲 开篇 自我介绍 &#xff1a;面试官你好&#xff0c;我叫林飞武&#xff0c;是一名通信工程大三学生&#xff0c;对计算机专业有着浓厚兴趣并且未来有志于在互联网的测试领域有深入发展。全套学习了计算机专业的专业课&#xff0c;计算机网络&#xff0c;操作系统等&#…