L2-018. 多项式A除以B
时间限制
400 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
陈越
这仍然是一道关于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
#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() { //freopen("data.txt", "r", stdin); 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); }
本文介绍了一种计算两个多项式相除的商和余的算法,详细解释了输入输出格式,并提供了一个C++实现示例。

被折叠的 条评论
为什么被折叠?



