1. 程式人生 > >C程式實驗(1)一個多項式可以表達為x的各次冪與係數乘積的和

C程式實驗(1)一個多項式可以表達為x的各次冪與係數乘積的和

題目內容:

一個多項式可以表達為x的各次冪與係數乘積的和,比如:

2x6+3x5+12x3+6x+20

現在,你的程式要讀入兩個多項式,然後輸出這兩個多項式的和,也就是把對應的冪上的係數相加然後輸出。

程式要處理的冪最大為100。

輸入格式:

總共要輸入兩個多項式,每個多項式的輸入格式如下:

每行輸入兩個數字,第一個表示冪次,第二個表示該冪次的係數,所有的係數都是整數。第一行一定是最高冪,最後一行一定是0次冪。

注意第一行和最後一行之間不一定按照冪次降低順序排列;如果某個冪次的係數為0,就不出現在輸入資料中了;0次冪的係數為0時還是會出現在輸入資料中。

輸出格式:

從最高冪開始依次降到0冪,如:

2x6+3x5+12x3-6x+20

注意其中的x是小寫字母x,而且所有的符號之間都沒有空格,如果某個冪的係數為0則不需要有那項。

輸入樣例:

6 2

5 3

3 12

1 6

0 20

6 2

5 3

2 12

1 6

0 20

輸出樣例:

4x6+6x5+12x3+12x2+12x+40

遇到的問題

  • 如何能夠根據輸入動態儲存這些資料呢
  1. 沒注意最高冪是100,所以我們可以使用有100個元素的陣列
  2. 可以用標號表示冪數,元素代表係數
  • 陣列的表示
    A[n]
  • 在迴圈中要用break
  • 輸出陣列的元素的時候
    printf(“%d”,arr[0]),因為陣列的第一個元素是地址
  • printf後面是不需要加地址的
#include<stdio.h>
#include<math.h>

int main()
{
	int N=101,i,n,a,flag=0;
	int arr[N];
	
	for(i=0;i<N;i++)
	{
		arr[i]=0;
	}
	
	while(flag<2)//輸入資料 
	{
		scanf("%d %d",&n,&a);
		
		if(n==0)
		{
			flag++;
		}
		
		if(arr[n]!=0)
		{
			arr[n]+=a;
		}
		else
		{
			arr[n]=a;
		}
	}
	
	int max=0;
	for(i=N;i>0;i--)//判斷最大的冪次 
	{
		if(arr[i]!=0)
		{
			max=i;
			break;
		}
		 
	 } 
	 
	 if(max==0)
	 {
	 	printf("%d",arr[0]);
	  } 
	  else
	  {
	  	for(i=max;i>-1;i--)
	  	{
	  		if(i>1)
	  		{
	  			if(abs(arr[i])==1)
	  			{
	  				printf("x%d",i);
				  }
				  else if(abs(arr[i])>1)
				  {
				  	printf("%dx%d",abs(arr[i]),i);
				  }
			  }
			  else if(i==1)
			  {
			  	if(abs(arr[i]==1))
			  	{
			  		printf("x");
				  }
				  else if(abs(arr[i]>1))
				  {
				  	printf("%dx",abs(arr[i]));
				  }
			  }
			  else if(arr[i]!=0)
			  {
			  	printf("%d",abs(arr[i]));
			  }
		  
		  if(i>0)
		  {
		  	if(arr[i-1]<0)
			  {
			  	printf("-");
			   } 
			   else if(arr[i-1]>0)
			   {
			   	printf("+");
			   }
		   } 
		   } 
	  }
	 
	  return 0;
 } 

程式碼終結

  • 結構
  1. 用陣列儲存資料,並且用flag變量表示結束兩個多項式
  2. 用for迴圈判斷最大的冪次
  3. 最難的就是後面的輸出了,要充分了解各種情況。第一個就是隻有一個常數的情況,第二個就是當係數為1時候,第三個就是當冪次為1時候的情況
  4. 使用絕對值,再在最後加上正負號,這樣可以減輕討論情況