PTA L2-018 多项式A除以B:模拟

题解

  • 模拟多项式的除法。
  • 注意精度问题和0多项式。

代码

#include 
using namespace std;
int const N = 100000 + 10;
double const eps = 1e-8;
double const eps2 = 0.05;
int n,e,cnt1,cnt2;
double a[N],b[N],c,ans[N],res[N];   //a[e] = c,表示cx^e,系数可能为浮点数,但是指数一定是整数
void solve(){
	for(int i=N-1;i>=0;i--)	if(fabs(a[i]) > eps){   //枚举a的每一项
		for(int j=N-1;j>=0;j--)	if(fabs(b[j]) > eps){   
			if(i < j)	return;
			c = a[i] / b[j];   //系数相除
			e = i - j;    //指数相减
			ans[e] = c;   //答案的一项
			break;
		}
		for(int j=N-1;j>=0;j--)	res[j] = 0;
		for(int j=N-1;j>=0;j--)	if(fabs(b[j]) > eps){	 //多项式B的每一项都乘以cx^e
			res[j+e] = c * b[j];
		}
		for(int j=N-1;j>=0;j--)	  //两式相减得余数
			a[j] = a[j] - res[j];  
	}
}
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++)   //多项式A
		cin>>e>>c,	a[e] = c;
	scanf("%d",&n);
	for(int i=1;i<=n;i++)   //多项式B
		cin>>e>>c,	b[e] = c;
	solve();
	for(int i=N-1;i>=0;i--){
		if(fabs(ans[i]) >= eps2)	cnt1++;
		if(fabs(a[i]) >= eps2)	cnt2++;
	}
	if(cnt1 == 0)	printf("0 0 0.0\n");
	else{
		printf("%d",cnt1);
		for(int i=N-1;i>=0;i--)	if(fabs(ans[i]) >= eps2)	printf(" %d %.1lf",i,ans[i]);
		printf("\n");
	}
	if(cnt2 == 0)	printf("0 0 0.0\n");
	else{
		printf("%d",cnt2);
		for(int i=N-1;i>=0;i--)	if(fabs(a[i]) >= eps2)	printf(" %d %.1lf",i,a[i]);
	}
	return 0;
}

 

你可能感兴趣的:(PTA)