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

相关文章

Linux下删除乱码文件和目录的实现方式

《Linux下删除乱码文件和目录的实现方式》:本文主要介绍Linux下删除乱码文件和目录的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux下删除乱码文件和目录方法1方法2总结Linux下删除乱码文件和目录方法1使用ls -i命令找到文件或目录

SpringBoot+EasyExcel实现自定义复杂样式导入导出

《SpringBoot+EasyExcel实现自定义复杂样式导入导出》这篇文章主要为大家详细介绍了SpringBoot如何结果EasyExcel实现自定义复杂样式导入导出功能,文中的示例代码讲解详细,... 目录安装处理自定义导出复杂场景1、列不固定,动态列2、动态下拉3、自定义锁定行/列,添加密码4、合并

mybatis执行insert返回id实现详解

《mybatis执行insert返回id实现详解》MyBatis插入操作默认返回受影响行数,需通过useGeneratedKeys+keyProperty或selectKey获取主键ID,确保主键为自... 目录 两种方式获取自增 ID:1. ​​useGeneratedKeys+keyProperty(推

Spring Boot集成Druid实现数据源管理与监控的详细步骤

《SpringBoot集成Druid实现数据源管理与监控的详细步骤》本文介绍如何在SpringBoot项目中集成Druid数据库连接池,包括环境搭建、Maven依赖配置、SpringBoot配置文件... 目录1. 引言1.1 环境准备1.2 Druid介绍2. 配置Druid连接池3. 查看Druid监控

Python通用唯一标识符模块uuid使用案例详解

《Python通用唯一标识符模块uuid使用案例详解》Pythonuuid模块用于生成128位全局唯一标识符,支持UUID1-5版本,适用于分布式系统、数据库主键等场景,需注意隐私、碰撞概率及存储优... 目录简介核心功能1. UUID版本2. UUID属性3. 命名空间使用场景1. 生成唯一标识符2. 数

Linux在线解压jar包的实现方式

《Linux在线解压jar包的实现方式》:本文主要介绍Linux在线解压jar包的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux在线解压jar包解压 jar包的步骤总结Linux在线解压jar包在 Centos 中解压 jar 包可以使用 u

Python办公自动化实战之打造智能邮件发送工具

《Python办公自动化实战之打造智能邮件发送工具》在数字化办公场景中,邮件自动化是提升工作效率的关键技能,本文将演示如何使用Python的smtplib和email库构建一个支持图文混排,多附件,多... 目录前言一、基础配置:搭建邮件发送框架1.1 邮箱服务准备1.2 核心库导入1.3 基础发送函数二、

c++ 类成员变量默认初始值的实现

《c++类成员变量默认初始值的实现》本文主要介绍了c++类成员变量默认初始值,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录C++类成员变量初始化c++类的变量的初始化在C++中,如果使用类成员变量时未给定其初始值,那么它将被

Python包管理工具pip的升级指南

《Python包管理工具pip的升级指南》本文全面探讨Python包管理工具pip的升级策略,从基础升级方法到高级技巧,涵盖不同操作系统环境下的最佳实践,我们将深入分析pip的工作原理,介绍多种升级方... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核

C++中NULL与nullptr的区别小结

《C++中NULL与nullptr的区别小结》本文介绍了C++编程中NULL与nullptr的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编... 目录C++98空值——NULLC++11空值——nullptr区别对比示例 C++98空值——NUL