two

L2-018 多项式A除以B (25 分)

这仍然是一道关于A/B的题,只不过A和B都换成了多项式。你需要计算两个多项式相除的商Q和余R,其中R的阶数必须小于B的阶数。

输入格式:

输入分两行,每行给出一个非零多项式,先给出A,再给出B。每行的格式如下:

N e[1] c[1] ... e[N] c[N]

其中N是该多项式非零项的个数,e[i]是第i个非零项的指数,c[i]是第i个非零项的系数。各项按照指数递减的顺序给出,保证所有指数是各不相同的非负整数,所有系数是非零整数,所有整数在整型范围内。

输出格式:

分两行先后输出商和余,输出格式与输入格式相同,输出的系数保留小数点后1位。同行数字间以1个空格分隔,行首尾不得有多余空格。注意:零多项式是一个特殊多项式,对应输出为0 0 0.0。但非零多项式不能输出零系数(包括舍入后为0.0)的项。在样例中,余多项式其实有常数项-1/27,但因其舍入后为0.0,故不输出。

输入样例:

4 4 1 2 -3 1 -1 0 -1
3 2 3 1 -2 0 1

输出样例:

3 2 0.3 1 0.2 0 -1.0
1 1 -3.1

解题思路

第一步:

1.有系数、指数,所以使用map存储数据类型

map<int,double>a;  //余数
map<int,double>b;  //除数
map<int,double>c;   //商

2.进行多项式的初始化

①a的初始化

int lena;   //a的项数
cin>>lena;
for(int i=0;i<lena;i++)
{int e;   //指数double c;  //系数cin>>e>>c;maxe_a=max(maxe_a,e);    //找到a的最高次指数a[e]=a[e]+c;
}

②b的初始化

注意:b还要多求一个最小项次数

int lenb;   //b的项数
cin>>lenb;
for(int i=0;i<lenb;i++)
{int e;   //指数double c;  //系数cin>>e>>c;mine_b=min(mine_b,b);    //找到b的最低次指数maxe_b=max(maxe_b,e);    //找到a的最高次指数b[e]=b[e]+c;
}

第二步:除法运算

1.运算次数:

(maxe_a-maxe_b)+1,即for(int i=maxe_a;i>=maxe_b;i--)

即进行几次除法的运算

2.商:

当前a的系数为 :当前a的最高次幂系数/b的最高次幂系数

当前a的指数为 :当前a的最高次幂-b的最高次幂

余数项c:没被削成0的项

商的其中一项就是当前a的最高次幂系数除以b的最高次幂系数

同理指数也是如此

为什么加一个当前呐?

----->a每次最高项都会被(b的最高次项*相应商的一项)所消掉,直到a最终变为要求的余数项为止

------>余数项就是a每一项每次别(b的每项*相应项的商)做差后系数没被削成0的项

for(int i=maxe_a;i>=maxe_b;i--)        //进行除法运算的次数
{if(b[maxe_b]!=0)       //当b的系数不为0时{div=1.0*a[i]/b[maxe_b];        //c的系数sub=i-maxe_b;         //c的指数c[sub]=div;          //余数maxe_c=max(maxe_c,sub);      //余数中最大的指数for(int j=i;j>=mine_b;j--)    //对商进行更新{if(j-sub>=0)         //指数不为0时a[j]=a[j]-b[j-sub]*c[sub];      //商}}
}

3.四舍五入运算

for(int i=maxe_c;i>=0;i--)
{c[i]=(double)((int)(c[i]*10+(c[i]<0?-0.5:0.5)))/10;if(c[i])cnt++;
}

整个程序的原码


#include<iostream>
using namespace std;
#include<map>
#include<algorithm>
#include<cmath>
int main()
{map<int,double>a;map<int,double>b;map<int,double>c;int lena,lenb;int maxe_a=0,maxe_b=0,maxe_c=0,mine_b=10000;double div;int sub;cin>>lena;for(int i=0;i<lena;i++){int e;double c;cin>>e>>c;maxe_a=max(maxe_a,e);a[e]=a[e]+c;}cin>>lenb;for(int i=0;i<lenb;i++){int e;double c;cin>>e>>c;mine_b=min(mine_b,e);maxe_b=max(maxe_b,e);b[e]=b[e]+c;}for(int i=maxe_a;i>=maxe_b;i--){if(b[maxe_b]!=0){div=1.0*a[i]/b[maxe_b];sub=i-maxe_b;c[sub]=div;maxe_c=max(maxe_c,sub);for(int j=i;j>=mine_b;j--){if(j-sub>=0)a[j]=a[j]-b[j-sub]*c[sub];}}}int cnt=0;for(int i=maxe_c;i>=0;i--){c[i]=(double)((int)(c[i]*10+(c[i]<0?-0.5:0.5)))/10;if(c[i])cnt++;}if(cnt==0)printf("0 0 0.0\n");else{cout<<cnt;for(int i=maxe_c;i>=0;i--){if(c[i])printf(" %d %.1lf",i,c[i]);}printf("\n");}cnt=0;for(int i=maxe_a;i>=0;i--){a[i]=(double)((int)(a[i]*10+(a[i]<0?-0.5:0.5)))/10;if(a[i])cnt++;}if(cnt==0)printf("0 0 0.0\n");else{cout<<cnt;for(int i=maxe_a;i>=0;i--){if(a[i])printf(" %d %.1lf",i,a[i]);}printf("\n");}return 0;
}

总结

1.区分商和余数,c为商,a为余数

2.第一个大循环,每次确定一个商的系数和指数

3.第二个小循环,进行余数a的更新,a[j]=a[j]-b[j-sub]*c[sub]\

4.四舍五入的操作:

a[i]=(double)((int)(a[i]*10+(a[i]<0?-0.5:0.5)))/10;

L2-018 多项式A除以B (25 分)相关推荐

  1. 【CCCC】L2-018 多项式A除以B (25分),多项式除法

    problem L2-018 多项式A除以B (25分) 这仍然是一道关于A/B的题,只不过A和B都换成了多项式.你需要计算两个多项式相除的商Q和余R,其中R的阶数必须小于B的阶数. 输入格式: 输入 ...

  2. L2-018 多项式A除以B (25分)

    这仍然是一道关于A/B的题,只不过A和B都换成了多项式.你需要计算两个多项式相除的商Q和余R,其中R的阶数必须小于B的阶数. 输入格式: 输入分两行,每行给出一个非零多项式,先给出A,再给出B.每行的 ...

  3. PTA 多项式A除以B (25 分)

    7-10 多项式A除以B (25 分) 这仍然是一道关于A/B的题,只不过A和B都换成了多项式.你需要计算两个多项式相除的商Q和余R,其中R的阶数必须小于B的阶数. 输入格式: 输入分两行,每行给出一 ...

  4. 团体天梯 L2-018 多项式A除以B (25 分)(测试点分析)

    L2-018 多项式A除以B (25 分) 这仍然是一道关于A/B的题,只不过A和B都换成了多项式.你需要计算两个多项式相除的商Q和余R,其中R的阶数必须小于B的阶数. 输入格式: 输入分两行,每行给 ...

  5. 模拟计算(L2-018 多项式A除以B (25 分))

    这一题是一道模拟计算题,只要足够细心就可以解决问题. 原题链接 L2-018 多项式A除以B (25 分) 这仍然是一道关于A/B的题,只不过A和B都换成了多项式.你需要计算两个多项式相除的商Q和余R ...

  6. PTA L2-018 多项式A除以B (多项式除法)

    L2-018 多项式A除以B (25 分) 这仍然是一道关于A/B的题,只不过A和B都换成了多项式.你需要计算两个多项式相除的商Q和余R,其中R的阶数必须小于B的阶数. 输入格式: 输入分两行,每行给 ...

  7. 多项式A除以B(模拟)

    L2-018 多项式A除以B (25 分) 题目链接 这仍然是一道关于A/B的题,只不过A和B都换成了多项式.你需要计算两个多项式相除的商Q和余R,其中R的阶数必须小于B的阶数. [输入格式] 输入分 ...

  8. PAT甲级 -- 1009 Product of Polynomials (25 分)

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

  9. C++学习之路 | PTA乙级—— 1010 一元多项式求导 (25分)(精简)

    1010 一元多项式求导 (25分) 设计函数求一元多项式的导数.(注:x ​n ​​ (n为整数)的一阶导数为nx ​n−1 ​​ .) 输入格式: 以指数递降方式输入多项式非零项系数和指数(绝对值 ...

最新文章

  1. 数据结构(08)— 线性单链表基本操作
  2. Oracle RAC 添加删除节点
  3. linux删除过期文件
  4. [转载] 变形金刚1
  5. python窗口程序-Python GUI 编程(Tkinter)
  6. RMAN异机恢复步骤及故障处理
  7. r k-means 分类结果_机器学习-Kmeans均值聚类算法(贪心学院)
  8. C#发送Email邮件方法总结
  9. CentOS7搭建ftp服务器(vsftpd,亲测成功)
  10. Docker持续交付部署类型
  11. (转)TweenMax动画库学习(四)
  12. php数组循环转为对象,php中循环实现(字符串,对象,或者数组)编码相互转换
  13. win7录屏_录屏软件Bandicam安装教程
  14. python蓝屏代码_死机、卡顿、蓝屏,Python部门的老江湖告诉我的一些超级变态代码...
  15. 广告视频投放展示平台 springboot+vue
  16. Maximum Likelihood 最大似然估计
  17. 深入solidity内部 -以太坊EVN插槽存储关系
  18. 朴实无华!注意力机制神经网络解析
  19. python如何安装spyder?
  20. Hbase Schema设计与数据模型操作

热门文章

  1. [日推荐]『Java学习者』爱学习的程序猿看过来~
  2. (二) Marlin-2.1.x 源码解析:步进电机S曲线加速
  3. python爬取+使用网易卡搭作品数量api
  4. 心电图前波过多_心电图怎么看,心电图讲解,心电图t波改变
  5. 项目终验PPT怎么做
  6. 攻防世界 Web baby_web
  7. 条形码生成软件如何制作渐变色条形码
  8. 关于双频/多频腔体滤波器的相关paper汇总
  9. 全场景智能收银机POS主板RK3568方案
  10. 国外建模大师精心总结:10个对精通建模用帮助的技巧 用过后觉得真的很实用!