这仍然是一道关于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
思路是用A[ ] B[ ] C[ ]来分别储存两个输入多项式和一个商多项式
其中索引i是指数A【i】是i指数前面的系数,后面A[ ]-=B[ ]*p 最后的A【】是余数多项式
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.StreamTokenizer;
public class Main{
static int N=10000;
static double[]A=new double[N];
static double[]B=new double[N];
static double[]C=new double[N];
static PrintWriter out=new PrintWriter(new OutputStreamWriter(System.out));
static boolean Nois0(double x)
{
return Math.abs(x)>=0.05;
}
public static void main(String[] args) throws IOException
{
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
StreamTokenizer token=new StreamTokenizer(br);
token.nextToken();
int N=(int)token.nval;
int Mx1=0;
int Mx2=0;
//分别输入AB多项式的数组
for(int i=0;i<N;i++)
{
token.nextToken();
int e=(int)token.nval;//指数2输入
token.nextToken();
A[e]=token.nval;
if(i==0)
{
Mx1=e;
}//各项按照指数递减的顺序给出,保证所有指数是各不相同的非负整数
//各项按照指数递减的顺序给出,保证所有指数是各不相同的非负整数
}
token.nextToken();
N=(int)token.nval;
for(int i=0;i<N;i++)
{
token.nextToken();
int e=(int)token.nval;//指数2输入
token.nextToken();
B[e]=token.nval;
if(i==0)
{
Mx2=e;
}//各项按照指数递减的顺序给出,保证所有指数是各不相同的非负整数
//各项按照指数递减的顺序给出,保证所有指数是各不相同的非负整数
}
int first=Mx1-Mx2;
while(Mx1>=Mx2)
{
double p=A[Mx1]/B[Mx2];
C[Mx1-Mx2]=p;// mx1-mx2 项的系数// mx1-mx2 项的系数// mx1-mx2 项的系数
for(int i=Mx1,j=Mx2;i>=0&&j>=0;i--,j--) {
A[i] -= B[j] * p; // 指数相同的对应位置的系数相减,现在A【】是每次除完后的余数数组!!!
}
while(Mx1>=Mx2 && !Nois0(A[Mx1])) Mx1--;//保护数组不全是0导致越界,//把指数是0向后找不是0的位置
}
print(C,first);
out.println();
print(A,Mx1);
out.flush();
out.close();
}
static void print(double shu[], int n)
{
// 查看多项式中,有多少个非零项
int cnt = 0;
for (int i = 0; i <= n; i++)
{
if (Nois0(shu[i])) cnt++;
}
// 输出项数
out.print(cnt);
// 零多项式
if (cnt == 0) out.print(" 0 0.0");
// 递减输出多项式中的非零项
for (int i = n; i >= 0; i--)
{
if (Nois0(shu[i])) out.printf(" %d %.1f", i, shu[i]);
}
}
}