中国MOOC数据结构:02-线性结构2 一元多项式的乘法与加法运算(Java)

设计函数分别求两个一元多项式的乘积与和。

输入格式:

输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。

输出格式:

输出分2行,分别以指数递降方式输出乘积多项式以及和多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格零多项式应输出0 0。(注意格式)

输入样例:

4 3 4 -5 2  6 1  -2 0
3 5 20  -7 4  3 1

输出样例:

15 24 -25 22 30 21 -10 20 -21 8 35 6 -33 5 14 4 -15 3 18 2 -6 1
5 20 -4 4 -5 2 9 1 -2 0

以下是没用链表的实现方法,在加法的时候如果选择是用一个数组插入另外一个,那么链表更好,但是如果选择是把两个数组放入一个新数组,这样写起来更简单。 

 

思路

1.加法,用比较两数组每个项的次数实现,次数大的先进入新建数组,一样大的系数合起来一起放进去

2.乘法,相当于用一个多项式的每一项乘另一个多项式,然后不断的调用加法加起来



import java.util.*;

public class Main
{
	public static void main(String[] args)
	{
		Scanner s1=new Scanner(System.in);
		
		int[] shuZu1=saoMiao(s1);
		int[] shuZu2=saoMiao(s1);
		
		int[] ji=chengFa(shuZu1,shuZu2);
		for (int i=0;i<ji.length-1;i++)
		{
			System.out.print(ji[i]+" ");
		}
		System.out.print(ji[ji.length-1]);
		System.out.println("");//输出格式要求最后一项后不能有空格
		
		int[] he=jiaFa(shuZu1,shuZu2);
		//这个例外不要在加法函数里面处理,否则会影响乘法函数
		if(he.length>0)
		{
			for (int i=0;i<he.length-1;i++)
			{
				System.out.print(he[i]+" ");
			}
			System.out.print(he[he.length-1]);
		}
		else 
		{
			System.out.println("0 0");
		}
	}
	
	
	
	//录入数组的扫描函数
	public static int[] saoMiao (Scanner s1)
	{	
		int changDu=2*(s1.nextInt());//乘2才能同时存系数和指数
		int[] shuZu=new int[changDu];
		for (int i=0;i<changDu;i++)
		{
			shuZu[i]=s1.nextInt();//nextInt可以读取一个个整数,几位都可以
		}
		return shuZu;
	}
	
	//加法函数
	public static int[] jiaFa(int[] a,int[] b)
	{
		//使用将两个数组传值进新数组的方法,而不是一个数组插入另一个。对于顺序表来说,传进新数组只用O(m),插入要O(mn),而空间复杂度一个是O(m+n),一个是O(m)
		int[] c=new int[a.length+b.length];
		int i=0;
		int j=0;
		int k=0;
		while(i<a.length||j<b.length)//如果两个都不小于即放完了就跳出
		{
			if (i==a.length||j==b.length)//当ab中有一个数组已经全放完了
			{
				if (i==a.length)//如果a已经把最后一项都放进c了,就只用放b
				{
					while(j<b.length)
					{
						c[k+1]=b[j+1];//指数存入
						c[k]=b[j];//系数存入
						k=k+2;//c这一项被存了考虑下一项
						j=j+2;//b这一项存了考虑下一项
					}
				}
				if (j==b.length)//如果a已经把最后一项都放进c了,就只用放a
				{
					while(i<a.length)
					{
						c[k+1]=a[i+1];//指数存入
						c[k]=a[i];//系数存入
						k=k+2;//c这一项被存了考虑下一项
						i=i+2;//a这一项存了考虑下一项
					}
				}
				continue;//这里break也可以,我只是想把控制权交回外面的while
			}
			if(a[i+1]>b[j+1])//如果a这一项的指数比b大那么就把a这一项存入c
			{
				c[k+1]=a[i+1];//指数存入
				c[k]=a[i];//系数存入
				k=k+2;//c这一项被存了考虑下一项
				i=i+2;//a这一项存了考虑下一项
			}
			else if(a[i+1]<b[j+1])//如果a这一项的指数比b小那么就把b这一项存入c
			{
				c[k+1]=b[j+1];//指数存入
				c[k]=b[j];//系数存入
				k=k+2;//c这一项被存了考虑下一项
				j=j+2;//b这一项存了考虑下一项
			}
			else if(a[i+1]==b[j+1])//如果a这一项的指数和b一样大那么就把这两项加起来一起存入c
			{
				if((a[i]+b[j])==0)//如果系数和为0不存
				{
					//k这一项没存东西,所以位置不懂
					i=i+2;//a这一项用了考虑下一项
					j=j+2;//b这一项用了考虑下一项
				}
				else 
				{
					c[k+1]=a[i+1];//指数存入,ab是一样的
					c[k]=a[i]+b[j];//系数存入,ab相加后再存
					k=k+2;//c这一项被存了考虑下一项
					i=i+2;//a这一项存了考虑下一项
					j=j+2;//b这一项存了考虑下一项
				}
				
			}
			
			//整理,把c没用的空位去掉,然后赋给d	
		}
		
		//这里千万不要d=c,c是要不断重新赋值的,把c的地址传给d没用,一定要传值
		int[] d=new int[k];
		for (int m=0;m<d.length;m++)
		{
			d[m]=c[m];
		}
		
		return d;
		
	}

	//乘法函数
	public static int[] chengFa(int[] a,int[] b)//计划是b每个单项乘整个a,构建一个新的多项式,然后再把新的多项式加起来
	{
		if(a.length==0||b.length==0)
		{
			int[] f={0,0};
			return f;
		}
		else
		{
			int i=0;//用于c构建过程,控制a
			int j=0;//控制b
		
			//b每个单项乘整个a,构建新多项式c
			int[] c=new int[a.length];
			//c全部加起来得到d
			int[] d=new int[a.length];
		
		
			//
			while(i<a.length)
			{

				c[i]=a[i]*b[j];//多项式相乘,系数相乘
				c[i+1]=a[i+1]+b[j+1];//多项式相乘,次数相加
				i=i+2;//到下一项
			
			}

			j=j+2;//一开始忘记加这个了所以外面这个循环无限循环了
			for(int n=0; n<a.length; n++)
			{
				d[n]=c[n];
			}
		
			//循环a的每一项和b一项相乘
			while(j<b.length)
			{
				i=0;
				while(i<a.length)
				{
					c[i]=a[i]*b[j];//多项式相乘,系数相乘
					c[i+1]=a[i+1]+b[j+1];//多项式相乘,次数相加
					i=i+2;//到下一项		
				}
				j=j+2;//一开始忘记加这个了所以外面这个循环无限循环了
				d=jiaFa(c,d);
			}	
			return d;
		}
	}
}

自检样例 (转自猪肉白菜炖粉条

样例 输入 输出
1
4 3 4 -5 2  6 1  -2 0
3 5 20  -7 4  3 1
15 24 -25 22 30 21 -10 20 -21 8 35 6 -33 5 14 4 -15 3 18 2 -6 1
5 20 -4 4 -5 2 9 1 -2 0
2
2 1 2 1 0
2 1 2 -1 0
1 4 -1 0
2 2
3
2 -1000 1000 1000 0
2 1000 1000 -1000 0
-1000000 2000 2000000 1000 -1000000 0
0 0
4
0
1 999 1000
0 0
999 1000

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章