PAT-Apat甲级题1009(python和c++实现)

2024-02-07 21:28

本文主要是介绍PAT-Apat甲级题1009(python和c++实现),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

PTA | 1009 Product of Polynomials

1009 Product of Polynomials

作者 CHEN, Yue

单位 浙江大学

This time, you are supposed to find A×B where A and B are two polynomials.

Input Specification:

Each input file contains one test case. Each case occupies 2 lines, and each line contains the information of a polynomial:

K N1​ aN1​​ N2​ aN2​​ ... NK​ aNK​​

where K is the number of nonzero terms in the polynomial, Ni​ and aNi​​ (i=1,2,⋯,K) are the exponents and coefficients, respectively. It is given that 1≤K≤10, 0≤NK​<⋯<N2​<N1​≤1000.

Output Specification:

For each test case you should output the product of A and B in one line, with the same format as the input. Notice that there must be NO extra space at the end of each line. Please be accurate up to 1 decimal place.

Sample Input:

2 1 2.4 0 3.2
2 2 1.5 1 0.5

Sample Output:

3 3 3.6 2 6.0 1 1.6

万事开头难,先读题!!!

这一次,你应该找到A×B,其中A和B是两个多项式。
输入规范:

每个输入文件包含一个测试用例。每种情况占用2行,每行包含一个多项式的信息:

K N1 aN1 N2 aN2. NK aNK

其中K是多项式中非零项的数目,Ni和aNi(i= 1,2,k,K)分别是指数和系数。给出了1≤K≤10,0≤NK <N2 <N1 ≤1000。
输出规格:

对于每个测试用例,您应该在一行中输出A和B的乘积,并使用与输入相同的格式。请注意,每行末尾必须没有多余的空格。请精确到小数点后1位。

完整的一遍题目读下来,可以发现,这个题目和上次的多项式求和很像很像,只是这边变成了多项式的乘法,那么其实大部分的解题思路还是完全一样的,那么从上述题目中,我们可以提取得到以下信息:

        1, 输入包含两个部分,一个部分是非零项数的个数,接下来是各个非零项指数及其次数

        2, 输出格式和输入一致,并且要求多项式系数部分保留一位小数

归纳总结完题目要点之后,现在是手搓代码时间!!

首先老样子,我们定义接收输入变量,先对输入进行处理,由于输入包含两次的内容,可以使用循环的方法进行存储,但是后续访问操作会变得比较困难,这里就直接偷懒,直接复制一份一摸一样的处理内容,在处理完输入之后,我们需要考虑如何处理存储计算结果的问题,那么这里结合C++和python这两种语言的特性,c++直接定义足够大的double数组,python则根据两次输入的最高项求和,以此初始化大小合适的dict,由于题中给出的最大的项数是1000项,这里初始化C++的double数组大小为2001,本部分代码如下:

C++:

    double D[2001] = {0};int k1, a1[21];double d1[21];cin >> k1;for(int i=0;i<k1;i++){cin>> a1[i] >> d1[i];}int k2, a2[21];double d2[21];cin >> k2;for(int i=0;i<k2;i++){cin>> a2[i] >> d2[i];}

python:

为了方便后续操作,这里直接对输入数据进行提取,将”指数:系数“关系对提取出来,并初始化大小为两次输入最高项之和的dict用于存储计算结果match_

lst1 = [eval(i) for i in input().split()][1:]
lst2 = [eval(i) for i in input().split()][1:]
mat1 = {lst1[i]:lst1[i+1] for i in range(0, len(lst1), 2)}
mat2 = {lst2[i]:lst2[i+1] for i in range(0, len(lst2), 2)}
match_ = {i:0 for i in range(lst1[0]+lst2[0]+1)}

此后就是分别遍历两次的输入内容,对其进行多项式的乘法操作,对于存储,python中,只要两个多项式相乘的结果(系数相乘,指数相加)中,指数对应上match_中的key,就将其value和计算结果相加,对于C++,由于初始化的为数组,则将数组下标作为指数运算的结果,将该下标对应的元素与系数运算的结果相加,同时,由于初始化中,将所有的指数情况都进行考虑,并将其初始结果赋初值为0,则需要另外统计运算结果的非零项,统计结果部分其实也较为简单,定义记录非零项的变量nozero,直接暴力遍历多项式运算结果,只要其系数部分不为零,则统计结果++,本部分代码如下:

C++:

    for (int i=0;i<k1;i++){for(int j=0;j<k2;j++){D[a1[i]+a2[j]] += d1[i] * d2[j];}}int nozero = 0;for(int i=0;i<2001;i++){if(D[i] != 0)nozero += 1;}

python:

for i in mat1:for j in mat2:match_[i+j] += mat1[i] * mat2[j]
nozero = 0
for i in match_:if match_[i] != 0:nozero += 1
print(nozero, end="")

对于最后的输出部分,由于要求较为简单,这里将不再赘述,但是涉及格式化输出的部分,还是建议使用最为原始的%d,%.1f这种格式。

以下是完整的代码:

python:

lst1 = [eval(i) for i in input().split()][1:]
lst2 = [eval(i) for i in input().split()][1:]
mat1 = {lst1[i]:lst1[i+1] for i in range(0, len(lst1), 2)}
mat2 = {lst2[i]:lst2[i+1] for i in range(0, len(lst2), 2)}
match_ = {i:0 for i in range(lst1[0]+lst2[0]+1)}
for i in mat1:for j in mat2:match_[i+j] += mat1[i] * mat2[j]
nozero = 0
for i in match_:if match_[i] != 0:nozero += 1
print(nozero, end="")
res = sorted(match_.items(),key=lambda x:x[0], reverse=True)
for i in res:if i[1] != 0:print(" %d %.1f" % (i[0], i[1]),end="")

C++:


#include<bits/stdc++.h>
using namespace std;int main(){double D[2001] = {0};int k1, a1[21];double d1[21];cin >> k1;for(int i=0;i<k1;i++){cin>> a1[i] >> d1[i];}int k2, a2[21];double d2[21];cin >> k2;for(int i=0;i<k2;i++){cin>> a2[i] >> d2[i];}for (int i=0;i<k1;i++){for(int j=0;j<k2;j++){D[a1[i]+a2[j]] += d1[i] * d2[j];}}int nozero = 0;for(int i=0;i<2001;i++){if(D[i] != 0)nozero += 1;}cout << nozero;for(int i=2000;i>=0;i--){if(D[i] != 0){printf(" %d %.1f", i, D[i]);}}return 0;
}

最后附上AK截图:

python:

C++:

写在后面:

        对于本题,由于前面出现过类似的代码题目,总体来说理解起来还是比较简单,本题采用的方法比较直接了当,需要稍微注意一些细节问题,如果您还有更好的解题思路或者方法,欢迎评论区交流!

这篇关于PAT-Apat甲级题1009(python和c++实现)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/688977

相关文章

Nginx实现高并发的项目实践

《Nginx实现高并发的项目实践》本文主要介绍了Nginx实现高并发的项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录使用最新稳定版本的Nginx合理配置工作进程(workers)配置工作进程连接数(worker_co

python中列表list切分的实现

《python中列表list切分的实现》列表是Python中最常用的数据结构之一,经常需要对列表进行切分操作,本文主要介绍了python中列表list切分的实现,文中通过示例代码介绍的非常详细,对大家... 目录一、列表切片的基本用法1.1 基本切片操作1.2 切片的负索引1.3 切片的省略二、列表切分的高

基于Python实现一个PDF特殊字体提取工具

《基于Python实现一个PDF特殊字体提取工具》在PDF文档处理场景中,我们常常需要针对特定格式的文本内容进行提取分析,本文介绍的PDF特殊字体提取器是一款基于Python开发的桌面应用程序感兴趣的... 目录一、应用背景与功能概述二、技术架构与核心组件2.1 技术选型2.2 系统架构三、核心功能实现解析

通过Python脚本批量复制并规范命名视频文件

《通过Python脚本批量复制并规范命名视频文件》本文介绍了如何通过Python脚本批量复制并规范命名视频文件,实现自动补齐数字编号、保留原始文件、智能识别有效文件等功能,听过代码示例介绍的非常详细,... 目录一、问题场景:杂乱的视频文件名二、完整解决方案三、关键技术解析1. 智能路径处理2. 精准文件名

基于Python开发PDF转Doc格式小程序

《基于Python开发PDF转Doc格式小程序》这篇文章主要为大家详细介绍了如何基于Python开发PDF转Doc格式小程序,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 用python实现PDF转Doc格式小程序以下是一个使用Python实现PDF转DOC格式的GUI程序,采用T

Python使用PIL库将PNG图片转换为ICO图标的示例代码

《Python使用PIL库将PNG图片转换为ICO图标的示例代码》在软件开发和网站设计中,ICO图标是一种常用的图像格式,特别适用于应用程序图标、网页收藏夹图标等场景,本文将介绍如何使用Python的... 目录引言准备工作代码解析实践操作结果展示结语引言在软件开发和网站设计中,ICO图标是一种常用的图像

C++ Primer 标准库vector示例详解

《C++Primer标准库vector示例详解》该文章主要介绍了C++标准库中的vector类型,包括其定义、初始化、成员函数以及常见操作,文章详细解释了如何使用vector来存储和操作对象集合,... 目录3.3标准库Vector定义和初始化vector对象通列表初始化vector对象创建指定数量的元素值

使用Python开发一个图像标注与OCR识别工具

《使用Python开发一个图像标注与OCR识别工具》:本文主要介绍一个使用Python开发的工具,允许用户在图像上进行矩形标注,使用OCR对标注区域进行文本识别,并将结果保存为Excel文件,感兴... 目录项目简介1. 图像加载与显示2. 矩形标注3. OCR识别4. 标注的保存与加载5. 裁剪与重置图像

使用Python实现表格字段智能去重

《使用Python实现表格字段智能去重》在数据分析和处理过程中,数据清洗是一个至关重要的步骤,其中字段去重是一个常见且关键的任务,下面我们看看如何使用Python进行表格字段智能去重吧... 目录一、引言二、数据重复问题的常见场景与影响三、python在数据清洗中的优势四、基于Python的表格字段智能去重

Spring AI集成DeepSeek实现流式输出的操作方法

《SpringAI集成DeepSeek实现流式输出的操作方法》本文介绍了如何在SpringBoot中使用Sse(Server-SentEvents)技术实现流式输出,后端使用SpringMVC中的S... 目录一、后端代码二、前端代码三、运行项目小天有话说题外话参考资料前面一篇文章我们实现了《Spring