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

相关文章

C++中unordered_set哈希集合的实现

《C++中unordered_set哈希集合的实现》std::unordered_set是C++标准库中的无序关联容器,基于哈希表实现,具有元素唯一性和无序性特点,本文就来详细的介绍一下unorder... 目录一、概述二、头文件与命名空间三、常用方法与示例1. 构造与析构2. 迭代器与遍历3. 容量相关4

C++中悬垂引用(Dangling Reference) 的实现

《C++中悬垂引用(DanglingReference)的实现》C++中的悬垂引用指引用绑定的对象被销毁后引用仍存在的情况,会导致访问无效内存,下面就来详细的介绍一下产生的原因以及如何避免,感兴趣... 目录悬垂引用的产生原因1. 引用绑定到局部变量,变量超出作用域后销毁2. 引用绑定到动态分配的对象,对象

SpringBoot基于注解实现数据库字段回填的完整方案

《SpringBoot基于注解实现数据库字段回填的完整方案》这篇文章主要为大家详细介绍了SpringBoot如何基于注解实现数据库字段回填的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以了解... 目录数据库表pom.XMLRelationFieldRelationFieldMapping基础的一些代

Java HashMap的底层实现原理深度解析

《JavaHashMap的底层实现原理深度解析》HashMap基于数组+链表+红黑树结构,通过哈希算法和扩容机制优化性能,负载因子与树化阈值平衡效率,是Java开发必备的高效数据结构,本文给大家介绍... 目录一、概述:HashMap的宏观结构二、核心数据结构解析1. 数组(桶数组)2. 链表节点(Node

Java AOP面向切面编程的概念和实现方式

《JavaAOP面向切面编程的概念和实现方式》AOP是面向切面编程,通过动态代理将横切关注点(如日志、事务)与核心业务逻辑分离,提升代码复用性和可维护性,本文给大家介绍JavaAOP面向切面编程的概... 目录一、AOP 是什么?二、AOP 的核心概念与实现方式核心概念实现方式三、Spring AOP 的关

Python版本信息获取方法详解与实战

《Python版本信息获取方法详解与实战》在Python开发中,获取Python版本号是调试、兼容性检查和版本控制的重要基础操作,本文详细介绍了如何使用sys和platform模块获取Python的主... 目录1. python版本号获取基础2. 使用sys模块获取版本信息2.1 sys模块概述2.1.1

一文详解Python如何开发游戏

《一文详解Python如何开发游戏》Python是一种非常流行的编程语言,也可以用来开发游戏模组,:本文主要介绍Python如何开发游戏的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录一、python简介二、Python 开发 2D 游戏的优劣势优势缺点三、Python 开发 3D

Python函数作用域与闭包举例深度解析

《Python函数作用域与闭包举例深度解析》Python函数的作用域规则和闭包是编程中的关键概念,它们决定了变量的访问和生命周期,:本文主要介绍Python函数作用域与闭包的相关资料,文中通过代码... 目录1. 基础作用域访问示例1:访问全局变量示例2:访问外层函数变量2. 闭包基础示例3:简单闭包示例4

Python实现字典转字符串的五种方法

《Python实现字典转字符串的五种方法》本文介绍了在Python中如何将字典数据结构转换为字符串格式的多种方法,首先可以通过内置的str()函数进行简单转换;其次利用ison.dumps()函数能够... 目录1、使用json模块的dumps方法:2、使用str方法:3、使用循环和字符串拼接:4、使用字符

Python版本与package版本兼容性检查方法总结

《Python版本与package版本兼容性检查方法总结》:本文主要介绍Python版本与package版本兼容性检查方法的相关资料,文中提供四种检查方法,分别是pip查询、conda管理、PyP... 目录引言为什么会出现兼容性问题方法一:用 pip 官方命令查询可用版本方法二:conda 管理包环境方法