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

相关文章

Python列表去重的4种核心方法与实战指南详解

《Python列表去重的4种核心方法与实战指南详解》在Python开发中,处理列表数据时经常需要去除重复元素,本文将详细介绍4种最实用的列表去重方法,有需要的小伙伴可以根据自己的需要进行选择... 目录方法1:集合(set)去重法(最快速)方法2:顺序遍历法(保持顺序)方法3:副本删除法(原地修改)方法4:

Python运行中频繁出现Restart提示的解决办法

《Python运行中频繁出现Restart提示的解决办法》在编程的世界里,遇到各种奇怪的问题是家常便饭,但是,当你的Python程序在运行过程中频繁出现“Restart”提示时,这可能不仅仅是令人头疼... 目录问题描述代码示例无限循环递归调用内存泄漏解决方案1. 检查代码逻辑无限循环递归调用内存泄漏2.

pytorch自动求梯度autograd的实现

《pytorch自动求梯度autograd的实现》autograd是一个自动微分引擎,它可以自动计算张量的梯度,本文主要介绍了pytorch自动求梯度autograd的实现,具有一定的参考价值,感兴趣... autograd是pytorch构建神经网络的核心。在 PyTorch 中,结合以下代码例子,当你

Python中判断对象是否为空的方法

《Python中判断对象是否为空的方法》在Python开发中,判断对象是否为“空”是高频操作,但看似简单的需求却暗藏玄机,从None到空容器,从零值到自定义对象的“假值”状态,不同场景下的“空”需要精... 目录一、python中的“空”值体系二、精准判定方法对比三、常见误区解析四、进阶处理技巧五、性能优化

使用Python构建一个Hexo博客发布工具

《使用Python构建一个Hexo博客发布工具》虽然Hexo的命令行工具非常强大,但对于日常的博客撰写和发布过程,我总觉得缺少一个直观的图形界面来简化操作,下面我们就来看看如何使用Python构建一个... 目录引言Hexo博客系统简介设计需求技术选择代码实现主框架界面设计核心功能实现1. 发布文章2. 加

SpringBoot集成Milvus实现数据增删改查功能

《SpringBoot集成Milvus实现数据增删改查功能》milvus支持的语言比较多,支持python,Java,Go,node等开发语言,本文主要介绍如何使用Java语言,采用springboo... 目录1、Milvus基本概念2、添加maven依赖3、配置yml文件4、创建MilvusClient

python logging模块详解及其日志定时清理方式

《pythonlogging模块详解及其日志定时清理方式》:本文主要介绍pythonlogging模块详解及其日志定时清理方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录python logging模块及日志定时清理1.创建logger对象2.logging.basicCo

JS+HTML实现在线图片水印添加工具

《JS+HTML实现在线图片水印添加工具》在社交媒体和内容创作日益频繁的今天,如何保护原创内容、展示品牌身份成了一个不得不面对的问题,本文将实现一个完全基于HTML+CSS构建的现代化图片水印在线工具... 目录概述功能亮点使用方法技术解析延伸思考运行效果项目源码下载总结概述在社交媒体和内容创作日益频繁的

Python如何自动生成环境依赖包requirements

《Python如何自动生成环境依赖包requirements》:本文主要介绍Python如何自动生成环境依赖包requirements问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录生成当前 python 环境 安装的所有依赖包1、命令2、常见问题只生成当前 项目 的所有依赖包1、

C++中初始化二维数组的几种常见方法

《C++中初始化二维数组的几种常见方法》本文详细介绍了在C++中初始化二维数组的不同方式,包括静态初始化、循环、全部为零、部分初始化、std::array和std::vector,以及std::vec... 目录1. 静态初始化2. 使用循环初始化3. 全部初始化为零4. 部分初始化5. 使用 std::a