L2-018 多项式A除以Bjava满分

这仍然是一道关于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]);
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值