中國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

 

 

 

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