这个代码是不完善的,找了很久没找到ac的方法郁闷死了,测试点一过不了。。。
三十年河东三十年河西,有缘再修吧。
这仍然是一道关于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<cstring>
//#include<cmath>
//#include<algorithm>
//#include<ctype.h>
//#include<stdio.h>
//#include<map>
#include<bits/stdc++.h>
using namespace std;
int main(){
double a[100005]={0},b[100005]={0},ans[100005]={0};
int aa=0,bb=0;
int n1;
int n2;
cin>>n1;
for(int i=0;i<n1;i++){
int x;
double y;
cin>>x>>y;
a[x]=y;
if(aa<x) aa=x;//记录最高项
}
cin>>n2;
for(int i=0;i<n2;i++){
int x;
double y;
cin>>x>>y;
b[x]=y;
if(bb<x) bb=x;//记录最高项
}
if(bb>aa){//b的最高项比a的最高项大,余数为a
cout<<"0 0 0.0"<<endl;
cout<<n1;
for(int i=aa;i>=0;i--){
if(fabs(a[i])>0.05) printf(" %d %.1lf",i,a[i]);
}
cout<<endl;
}
else{
int x=aa;//记录最高项
while(aa>=bb){//还可以进行除法
double m=a[aa]/b[bb];//系数
ans[aa-bb]+=m;//最高项相除的结果记录
for(int i=bb;i>=0;i--){//更新a
if(fabs(b[i])>0.05){//系数合法
a[i+aa-bb]-=m*b[i];//相除结果与b相乘,更新到a里面
}
}
while(fabs(a[aa])<=0.05){//更新a
aa--;
}
}
int f1=0,f2=0;
for(int i=x;i>=0;i--){//从最最大的指数(数组下标)开始遍历
if(fabs(ans[i])>0.05) f1++;//记录商的项数
if(fabs(a[i])>0.05) f2++;//记录余的项数
}
if(f1==0) cout<<"0 0 0.0"<<endl;//商为零(太小了被约成0的情况)
else{
cout<<f1;
for(int i=f1;i>=0;i--){
if(fabs(ans[i])>0.05) printf(" %d %.1lf",i,ans[i]);
}
cout<<endl;
}
if(f2==0) cout<<"0 0 0.0"<<endl;//输出余
else{
cout<<f2;
for(int i=x;i>=0;i--){
if(fabs(a[i])>0.05) printf(" %d %.1lf",i,a[i]);
}
cout<<endl;
}
}
return 0;
}