比较难想的一道题,需要知道多项式除法的方法,具体解释在代码中
#include<bits/stdc++.h>
using namespace std;
//a,b分别存储a多项式和b多项式,c是最后的商,最后a剩下的就是余数
double a[100010],b[100010],c[100010];
//舍去函数
double op(double x){bool flag = 0;if(x < 0) flag = 1;x = abs(x);int y = x * 100;if(y % 10 >= 5){y += 10;}if(flag == 1){return -(double)1.0*y/100;}return (double)1.0*y/100;
} int main(){int n,m;cin>>n;int indexa,indexb,indexc;indexa = indexb = -1;for(int i = 1 ; i <= n ; i++){int x,y;cin>>x>>y;a[x] = y; //存储每个指数对应的系数indexa = max(indexa,x); } cin>>m;for(int i = 1 ; i <= m ; i++){int x,y;cin>>x>>y;b[x] = y; //存储每个指数对应的系数indexb = max(indexb,x); } indexc = indexa - indexb; //表示商的最高项while(indexa >= indexb){double k = a[indexa] / b[indexb]; //每次把最高项化为0,相当于执行a - b * k; c[indexa - indexb] = k; //表示商的当前指数对应的系数 //还要操作a的其他项,也就是其他项也要减去对应b*k;for(int i = indexa,j = indexb ; i >= 0 && j >= 0 ; i--,j--){a[i] -= k * b[j]; //这一步不太好理解 ,具体请看下方 } /*这一步其实就是对a多项式进行一个更新,因为我们当前把最高项化为0,也就是说减去 b乘以k*x^n,所以我们就可以这样枚举去更新,比如8 67 56 4 */while(indexa >= 0 && fabs(a[indexa]) <= 1e-6){indexa--;}}int cnt1 = 0; //判断c是不是0 for(int i = indexc ; i >= 0 ; i--){if( op(fabs(c[i])) >= 0.1){cnt1++;}} cout<<cnt1;if(cnt1 == 0) cout<<" 0 0.0";else{for(int i = indexc ; i >= 0 ; i--){if( op(fabs(c[i])) >= 0.1){printf(" %d %.1lf",i,c[i]);}} }cout<<endl;int cnt2 = 0; //判断a是不是0 for(int i = indexa ; i >= 0 ; i--){if( op(fabs(a[i])) >= 0.1){cnt2++;}} cout<<cnt2;if(cnt2 == 0) cout<<" 0 0.0";else{for(int i = indexa ; i >= 0 ; i--){if( op(fabs(a[i])) >= 0.1){printf(" %d %.1lf",i,a[i]);}} }cout<<endl;return 0;
}