7-10 多项式A除以B (25 分)
题目链接:https://pintia.cn/problem-sets/1108548596745592832/problems/1108548661014913033
题目大意:
这仍然是一道关于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,故不输出。
具体思路:模拟多项式除法,注意精度控制。
AC代码:
1 #include<bits/stdc++.h> 2 using namespace std; 3 # define ll long long 4 # define inf 0x3f3f3f3f 5 const int maxn = 1e5+100; 6 double a[maxn],b[maxn],c[maxn]; 7 int main() 8 { 9 int n,m,tmp,maxa,maxb; 10 scanf("%d",&n); 11 for(int i=0; i<n; i++) 12 { 13 scanf("%d",&tmp); 14 scanf("%lf",&a[tmp]); 15 if(i==0) 16 maxa=tmp; 17 } 18 scanf("%d",&m); 19 for(int i=0; i<m; i++) 20 { 21 scanf("%d",&tmp); 22 scanf("%lf",&b[tmp]); 23 if(i==0) 24 maxb=tmp; 25 } 26 int j; 27 for(int i=maxa; i>=maxb; i--) 28 { 29 c[i-maxb]=a[i]/b[maxb]; 30 for( j=maxb; j>=0; j--) 31 { 32 a[i+j-maxb]-=b[j]*c[i-maxb]; 33 } 34 } 35 int num1=0,num2=0; 36 for(int i=maxa-maxb; i>=0; i--) 37 { 38 if(fabs(c[i])>1e-6) 39 { 40 if(fabs(c[i])<0.05) 41 c[i]=0; 42 else 43 num1++; 44 } 45 } 46 if(num1==0) 47 { 48 printf("0 0 0.0\n"); 49 } 50 else 51 { 52 printf("%d",num1); 53 for(int i=maxa-maxb; i>=0; i--) 54 { 55 if(fabs(c[i])>1e-6) 56 printf(" %d %.1lf",i,c[i]); 57 } 58 printf("\n"); 59 } 60 for(int i=maxb-1; i>=0; i--) 61 { 62 if(fabs(a[i])>1e-6) 63 { 64 // cout<<a[i]<<endl; 65 if(fabs(a[i])<0.05) 66 a[i]=0; 67 else 68 num2++; 69 } 70 } 71 if(num2==0) 72 { 73 printf("0 0 0.0\n"); 74 } 75 else 76 { 77 printf("%d",num2); 78 for(int i=maxb-1; i>=0; i--) 79 { 80 if(fabs(a[i])>1e-6) 81 printf(" %d %.1lf",i,a[i]); 82 } 83 printf("\n"); 84 } 85 }