L2-018. 多项式A除以B

这仍然是一道关于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

最初看到这道题就头疼,做加法乘法的时候就很烦心,现在又来个除法,折磨人啊,想了想数学上也做过这种题,拼凑嘛,我记得当时还是对于分子分母都是多项式的进行化简的一个方法。。说道拼凑就是a/b,只要a找那个存在比b中最高次的指数大,那么就可以拼凑,拿样例来说,a = x^4 - 3x^2 - x - 1,b = 3x^2 - 2x + 1。对于a的第一项指数4比b最高次指数2大,那么商的第一项就是x^4/3x^2 = 0.3x^2,然后用0.3x^2去乘以b的每一项,在a中更新,也就是a要减去b*0.3x^2,更新完以后,a要继续重复以上过程,知道a中最高次比b中最高次低,剩下的就算是余数了,这里用了个map记录a,方便进行更新,b自始至终是不变的。

代码:
#include <iostream>
#include <map>
#include <cmath>
#include <cstdio>
using namespace std;//系数要求保留一位小数,所以绝对值小于0.05都当成0对待
struct poly
{
    int e;
    double c;
}p[10000],ans[10000];
int main()
{
    int n = 0,e = 0,c = 0,m = -1,ant = 0;//m记录a中最高次 e是指数 c是系数 输入都是整数
    map<int,double> q;
    cin>>n;
    for(int i = 0;i < n;i ++)
    {
        cin>>e>>c;
        q[e] = c;
        if(i == 0)m = e;
    }
    cin>>n;
    for(int i = 0;i < n;i ++)
    {
        cin>>p[i].e>>p[i].c;
    }
    while(m >= p[0].e)
    {
        double change = q[m]/p[0].c;//分析中所述的 a中最高次除以b中最高次 系数比
        int diff = m - p[0].e;//指数比
        if(fabs(change) >= 0.05)
        {
            ans[ant].e = diff;
            ans[ant ++].c = change;
            for(int i = 0;i < n;i ++)//change 乘以 b 更新a中的变化
            {
                q[p[i].e + diff] -= change * p[i].c;
            }
        }
        else m --;//一定别忘了m--  不然会超时,太过于马虎  if else语句还是想清楚 写完备一些好光有if没else就容易错误啊。。
        while(m >= p[0].e && fabs(q[m]) < 0.05)
        {
            m --;
        }
    }
    cout<<ant;
    if(!ant)cout<<" 0 0.0";
    for(int i = 0;i < ant;i ++)
        printf(" %d %.1f",ans[i].e,ans[i].c);
    cout<<endl;
    ant = 0;
    while(m >= 0)
    {
        if(fabs(q[m]) >= 0.05)
        {
            ans[ant].e = m;
            ans[ant ++].c = q[m];
        }
        m --;
    }
    cout<<ant;
    if(!ant)cout<<" 0 0.0";
    for(int i = 0;i < ant;i ++)
        printf(" %d %.1f",ans[i].e,ans[i].c);
}
时间: 2024-08-03 17:36:31

L2-018. 多项式A除以B的相关文章

多项式A除以B

这个问题我是在PAT大区赛题里遇见的.题目如下: 多项式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个非零项的系数.各项按照指数递减的顺序给出,保证所有指数是各不相同的非负整数,所有系

团体程序设计天梯赛 L2-018. 多项式A除以B(模拟)

题意:给你A,B两个多项式,问你A/B的值:注意多项式给你的是每个式子的指数与系数:保留到一位小数,如果出现系数为0(保留后也是)的情况,请不要输出它,如果没有非系数为0的情况就输出特殊 题解:多项式类似于"a*x^4+b*x^3+c*x^2+d*x^1+e*x^0"的形式,两个多项式除法就是模拟除法做 现在被除数最大指数的系数.被 除数最大指数的系数除以.结果就是商的系数,两个指数的差就是商的指数 然后枚举除数每一位乘以这个值来被 被除数减去,最后找被除数后一个位置继续循环,直到被除

PAT L2-018. 多项式A除以B

暴力,模拟. 比赛搞了一个小时搞到了$1$分.赛场上不够冷静......之前没接触过多项式除法,但赛场上想到了除法的规则,莫名其妙写的时候不知道哪里崩了.对于这样的题目,应该先测一测数据的指数是不是很大,指数不大开数组存就可以了. #include<bits/stdc++.h> using namespace std; double eps=1e-1; double a[5010],b[5010],c[5010]; int n; int main() { memset(a,0,sizeof a

理解支持向量机

支持向量机是一个二类分类模型,但也可以扩展为多类分类.其基于间隔最大化和核技巧的特点可以使它可以灵活处理线性或非线性分类问题. 支持向量机可是形式化为一个凸二次规划问题,学习算法是求解基于凸二次规划的最优化算法. 按照训练数据是否线性可分,支持向量机可以分为基于硬间隔的线性可分支持向量机.基于软间隔的线性支持向量机.基于核技巧和软间隔最大化的非线性支持向量机.三者复杂性是依次增加的. 1.基于硬间隔最大化的线性可分支持向量机 我们知道,感知机和决策树等学习方法没有区分模型的输入空间和特征空间,即

Matlab 学习之旅(一)

一.脚本文件和M函数 1.1  脚本文件      脚本文件是命令行的集合,由一系列 MATLAB 命令.内置函数及M 文件等组成的文件.脚本文件在MATLAB 编译器中建立,并被保存为.m文件,按顺序执行,执行过程中生成的变量存放在当前工作空间中.     注意:脚本不能返回输出变量,所有创建的变量将保留在工作空间中,但脚本能提供图形输出,就像使用图形输出函数plot()一样. 例子:    利用M文件编辑器,键入命令并保存为magicrank.m        array = zeros(1

Leetcode 线性表 数 Add Two Numbers

本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie Add Two Numbers Total Accepted: 13127 Total Submissions: 58280 You are given two linked lists representing two non-negative numbers. The digits are stored in reverse order and each of their nodes

正则化方法:L1和L2 regularization、数据集扩增、dropout

本文是<Neural networks and deep learning>概览 中第三章的一部分,讲机器学习/深度学习算法中常用的正则化方法.(本文会不断补充) 正则化方法:防止过拟合,提高泛化能力 在训练数据不够多时,或者overtraining时,常常会导致overfitting(过拟合).其直观的表现如下图所示,随着训练过程,网络在training data上的error渐渐减小,但是在验证集上的error却反而渐渐增大--因为训练出来的网络过拟合了训练集,对训练集外的数据却不work

【信号与系统】多项式化简方法

多项式长除法 简介 ??? ? ? ? 多项式长除法?是代数中的一种算法,用一个同次或低次的多项式去除另一个多项式.是常见算数技巧长除法的一个推广版本.它可以很容易地手算,因为它将一个相对复杂的除法问题分解成更小的一些问题. 示例 计算 ? 把被除式.除式按某个字母作降幂排列,并把所缺的项用零补齐,写成以下这种形式: ? 然后商和余数可以这样计算: 将分子的第一项除以分母的最高次项(即次数最高的项,此处为x).结果写在横线之上(x3?÷?x?=?x2). 将分母乘以刚得到结果(最终商的第一项),

数据结构第二次上机实验【链表实现多项式的加法和乘法】

利用链表实现一元多项式的加法和乘法 #define null 0 #include "stdio.h" #include "stdlib.h" #include "math.h" int op; typedef struct { float coef;//系数 int expn;//指数 }term; typedef struct Lnode { term data; Lnode *next; }*Link,*Linklist; int cmp(