2014年12月18日 星期四

[C/C++ 演算法]-資料結構與演算法(文魁):兩個多項式相加的演算法

[C/C++ 演算法]-資料結構與演算法(文魁)兩個多項式相加的演算法



 


 


線上執行結果:http://www.tutorialspoint.com/compile_c_online.php


 


/* =========== Program Description ========= */
/* 程式名稱 : 4_1.cpp */
/* 演算法名稱:兩個多項式相加的演算法 */
/* 輸入:用陣列代表的多項式 */
/* 輸出:用陣列代表的二個多項式相加的結果 */
/* ========================================= */


// 宣告標頭檔
#include "stdio.h"
#include "malloc.h"
#include "string.h"

// 宣告函式原型

// 利用傳址的方式把Array AV,AW,BV,BW,CV,CW傳進polyadd函式中
void polyadd(int *AV,int *AW,int *BV,int *BW,int *CV,int *CW);

void main()
{
int AV[5]={4,1,3,4,5};
int AW[5]={0,1,3,4,5};
int BV[4]={3,2,3,6};
int BW[4]={0,2,3,6};
int CV[10]={0};
int CW[10]={0};
int i;

/*list Array A*/
printf("A:");
for(i=1;i<=AV[0];i++)
if(i==AV[0])
printf("%d*(X**%d) \n",AV[i],AW[i]);
else
printf("%d*(X**%d) + ",AV[i],AW[i]);

/*list Array B*/
printf("B:");
for(i=1;i<=BV[0];i++)
if(i==BV[0])
printf("%d*(X**%d) \n",BV[i],BW[i]);
else
printf("%d*(X**%d) + ",BV[i],BW[i]);

polyadd(AV,AW,BV,BW,CV,CW);

/*list Array B*/
printf("C:");
for(i=1;i<=CV[0];i++)
{
if(CV[i]==0)
continue;
if(i==CV[0])
printf("%d*(X**%d) \n",CV[i],CW[i]);
else
printf("%d*(X**%d) + ",CV[i],CW[i]);
}



getchar();
}

void polyadd(int *AV,int *AW,int *BV,int *BW,int *CV,int *CW)
{
int Ano,Bno,Tno=0,k=0,i,j,c;
/*Ano,Bno��A,B多項式非零的項數*/
Ano=AV[0];Bno=BV[0];
i=1;j=1;
int *TV=(int*)malloc((Ano+Bno)*sizeof(int));
int *TW=(int*)malloc((Ano+Bno)*sizeof(int));

for(i=1;i<=Ano+Bno;i++) //以數列A為主
{
c=AW[i]; //決定現在要處理的指數值
k++;
TW[k]=AW[i]; //先把這個指數值的係數的��起來
TV[k]=AV[i];

for(j=1;j<=Bno;j++) //來看數列B中的元素
{
if (c==BW[j]) //處理相同指數值的項
{
TV[k]=TV[i]+BV[j];

BV[j]=0;
BW[j]=0;
}else if (c<BW[j]) //假設數列B��遞增,所以後面已經沒有相同的項了
break;
else if (c>BW[j]) //假設數列B��遞增,所以後面可能還有相同的項了
continue;
}

}

c=1; Tno=Ano;
for(i=1;i<=Tno;i++) //以數列T為主
{
for(j=1;j<=Bno;j++) //來看數列B中剩下沒有處理的元素
{
if((BV[j]!=0) && (BW[j]!=0))
{
if(TW[i]<BW[j])
{
CV[c]=TV[i];
CW[c]=TW[i];
c++;
}else{
i--;
CV[c]=BV[j];
CW[c]=BW[j];
c++;
BV[j]=0;
BW[j]=0;
}
break;
}
}
}

for(j=1;j<=Bno;j++) //來看數列B中剩下沒有處理的元素
{
if((BV[j]!=0) && (BW[j]!=0))
{
CV[c]=BV[j];
CW[c]=BW[j];
c++;
}
}

CV[0]=c-1; //第0項放的��個數要扣除掉

free(TV);
free(TW);
}

 










 

 






沒有留言:

張貼留言